2012-05-24 2 views
0

Я создаю приложение с использованием C# 2010, целью которого является копирование файлов с указанным расширением. Он использует .NET Framework 3.5.Directory.CreateDirectory не работает

я следующий кусок кода:

private void GetFiles() 
    { 
     bool validext; 
     foreach (string filePath in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories)) 
     { 
      //Check if the file has a specified extension 
      validext = false; 
      foreach (string extension in ext) 
       if (HasExtension(filePath, extension)) 
       { 
        validext = true; 
        break; 
       } 

      if ((validext && mode == 1) || (!validext && mode == 2)) 
      { 
       Directory.CreateDirectory(Path.GetDirectoryName(filePath)); 
       to_copy.Add(filePath); 
      } 
     } 
     totalcount = to_copy.Count; 
    } 

Проблема заключается в этой команде:

Directory.CreateDirectory(TrimFile(filePath)); 

Это не вызывает каких-либо исключений, путь к каталогу, она должна создавать корректен и приложение работает с правами администратора. Тем не менее, каталог не создается. Поиск в Интернете не дал мне ответов, так что мой вопрос:

Почему Directory.CreateDirectory(TrimFile(filePath)); не работает?

EDIT: Я заменил функцию FileTrim на Path.GetDirectoryName(filePath).

+2

Можете ли вы разместить вывод 'TrimFile (filePath)' пожалуйста. –

+1

Какова цель TrimFile? Можете ли вы показать нам, что содержимое строки пути было до и после прохождения TrimFile? Я бы предположил, что вот где ваша проблема лежит –

+3

См. Здесь: http://stackoverflow.com/questions/888228/why-is-io-directory-createdirectory-succeeding-when-it-shouldnt –

ответ

3

Позволяет «Debug» код

private void GetFiles() 
{ 
    //1. Lets say SourcePath = "C:\some\kind\of\directory\" 
    foreach (string filePath in Directory.GetFiles(SourcePath, "*.*", SearchOption.AllDirectories)) 
    { 
     //2. Lets say we have file filePath = "C:\some\kind\of\directory\file.txt" 

     //.. all validation 

     //3. At this point Path.GetDirectoryName("C:\some\kind\of\directory\file.txt") 
     // returns "C:\some\kind\of\directory\" 
     //4. Lets create that directory...but wait its already exist and contains some files! 
     // Why create what already exists? 
     Directory.CreateDirectory(Path.GetDirectoryName(filePath)); 
     to_copy.Add(filePath); 
    } 
} 

Так истина заключается в том, что ваш CreateDirectory вызов бесполезно, потому что вы уже перекручивание через существующие файлы в каталогах. Если вы не хотите, чтобы создать позволяет сказать, что во всех каталогах новый подраздел каталога «Temp», то вам нужно сделать, это:

Directory.CreateDirectory(Path.Combine(Path.GetDirectoryName(filePath), "Temp")); 

После этого вы получите созданный C:\some\kind\of\directory\Temp каталог.

Чтобы скопировать файл в другой каталог, вам нужно сделать, это:

string directoryToCopyFiles = @"C:\My\directory\of\file\copies"; 
if(!Directory.Exists(directoryToCopyFiles)) 
    Directory.CreateDirectory(directoryToCopyFiles); 

File.Copy(Path.Combine(directoryToCopyFiles, Path.GetFileName(filePath)), filePath); 

После этого каталога C:\My\directory\of\file\copies будет создан, если он не существовал раньше, и файл с таким же именем будет скопирован там.

+0

Я думаю, что я не детализировал цель программы правильно. Ошибка заключалась в том, что я пытался создать каталоги, которые я хотел скопировать в исходной папке, а не в папку назначения, что было явно бессмысленно, как вы указали. Решением было заменить Directory.CreateDirectory на 'Directory.CreateDirectory (Path.GetDirectoryName (filePath) .Replace (SourcePath, DestinationPath));'. –

+0

Тем не менее, ваш комментарий указал мне в правильном направлении, поэтому на самом деле это ответ. Большое спасибо за помощь! –

0

Я недавно упал в этом, как хорошо, и глупо мне, что я не был бетонирования правильный путь, так что это было создание каталога я забетонировали ... внутри VSProjects/ProjectName/bin/Debug/: 'D

Перед :

if (!Directory.Exists(Path.GetDirectoryName(properties.ApiConfigRoute))) 
     Directory.CreateDirectory("ConfigFolder"); 

После:

if (!Directory.Exists(Path.GetDirectoryName(properties.ApiConfigRoute))) 
     Directory.CreateDirectory(Path.GetDirectoryName(properties.ApiConfigRoute)); 

Doh! Надеюсь, поможет. Просто убедитесь, что вы создаете его с абсолютным маршрутом .

Смежные вопросы