2016-01-24 6 views
3

У меня есть консольное приложение, которое я создал для себя, чтобы переименовать .mp3 загружаемых файлов. Это приложение работает безупречно в течение нескольких месяцев, но внезапно бросает на меня озаглавленное исключение с одним конкретным каталогом. Мало того, что это один каталог, но происходит только на выбранном количестве файлов - 3 из них были успешно переименованы.DirectoryNotFoundException - Не удалось найти часть пути

Вот мой путь к директории и файлы:

enter image description here

Вот фрагмент пути каталога, где выбрасывается исключение, наряду с сообщением, за исключением в:

enter image description here

И вот мой код:

static void Main(string[] args) { 
    string dir = @"M:\Temp Downloading Folder"; 

    var files = new DirectoryInfo(dir + @"\Gregory Alan Isakov Discography [2005 - 2013]\Rust Colored Stones").GetFiles("*.mp3").ToList(); 

    foreach (var item in files) { 
     if (item.Name.Substring(0, 2).All(char.IsDigit)) { 
      //string fullName = item.FullName.Replace("\\", "/"); 
      string newName = "Gregory Alan Isakov "; 
      //exception thrown here 
      File.Move(item.FullName, item.FullName.Replace(item.Name.Substring(0, 3), newName)); 
     } 
    } 
    Console.WriteLine("Done!"); 
    Console.ReadKey(); 
} 

Я попытался изменить путь, чтобы иметь / вместо \\ с тем же результатом.

Согласно Documentation on MSDN:

Исключение, которое выбрасывается, когда часть файла или каталога не может быть найден.

Однако, каталог является найден и правильно переименован первым 3 файла (как показано на первом изображении).

Может ли кто-нибудь объяснить мне, почему это происходит?

+0

Распечатать значение этого выражения 'item.FullName.Replace (item.Name.Substring (0, 3), newName)'. – PetSerAl

+0

Может быть, имя папки слишком длинное? Попробуйте более короткий путь по тем же файлам и посмотрите, не вызывает ли такая ошибка. – Chase

+0

Это обычная проблема с получением файлов. Он выполняет поиск вложенных папок и прерывается при возникновении любого исключения. Чтобы продолжить поиск, вам понадобится обработчик исключений, который продолжит поиск после исключения. единственный способ сделать это правильно - иметь рекурсивную функцию. – jdweng

ответ

4

У Вас есть ошибка в коде, который изменяет папку вместо имени файла, работает ваш код:

C: \ Temp Загрузка папки \ Gregory Alan Исаков Дискография [2005 - 2013] \ Руст Цветные камни \ 05 - Только Ghosts.mp3

изменяется на:

C: \ Temp Загрузка папки \ Gregory Alan Исаков Дискография [20 Григорий Алан Исаков - 2013] \ Rust Цветные камни \ Gregory Alan Исаков - только Ghosts.mp3

Я позволяю отладки и исправить это самостоятельно.

+0

Вы уверены? Если это всего лишь ошибка, я с удовольствием удалю вопрос, но на самом деле я не получаю такой результат. –

+1

Попробуйте вывести все строки в 'File.Move (...' перед этой строкой, и вы увидите. –

+2

Yup, видя это сейчас. Кажется, что это связано с файловым путем, включая '05', то же, что и имя файла. Хороший улов! Я действительно оставлю этот вопрос, потому что другие могут попасть в ту же ловушку, что и я. –

0

Проблема может быть связана с длиной пути к папке. Сократите длину и повторите попытку.

Microsoft's documentation on file naming and path lengths упоминает, что Windows налагает ограничение на 260 символов для общей длины пути плюс его имя файла; это упоминается как Maximum Path Length Ограничение, цитируемый здесь для облегчения ссылки:

В Windows API, (с некоторыми исключениями, описанных в следующих пунктах), максимальная длина пути составляет MAX_PATH, который определяется как 260 символов. Локальный путь структурирован в следующем порядке: букву диска, двоеточие, обратную косую черту, компоненты имени, разделенные обратными косыми чертами и завершающий нулевой символ. Например, максимальный путь на диске D является «D: \ some string длиной 256 символов» где «» представляет невидимый завершающий нулевой символ для текущей кодовой страницы системы. (Символы <> здесь используются для визуальной ясности и не может быть частью правильной строки пути.)

Однако, если вы настойчивы об использовании имен путей как есть, вы можете исследовать с помощью расширенной -length, используя префиксные пути с символом "\?" нотации.

API-интерфейс для Windows имеет множество функций, которые также имеют версии Unicode для разрешения на пути расширенных длинами для максимальной общей длины пути 32767 символов. Этот тип пути состоит из компонентов , разделенных обратными косыми чертами, каждый до значения, возвращаемого в параметре lpMaximumComponentLength функции GetVolumeInformation (это значение обычно составляет 255 символов). Чтобы указать путь расширенной длины , используйте префикс «\? \». Например, «\? \ D: \ very длинный путь».

+0

Я не проголосовал, но я повел вас по тропинке сада, не осознав полностью ту ложную ошибку, которую я сделал. Ответ Нимы Ара был фактически правильным, и я объяснил это в своем комментарии. –

+0

Обновленный ответ. В какой-то момент вы также можете столкнуться с этой проблемой, поэтому я думаю, что стоит опубликовать. :) – Chase

+0

Да, пожалуйста, объясните -обвините, кто бы это ни сделал. Мой ответ кажется актуальным, даже если это не было фактическим решением проблемы. – Chase

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