Фрагмент второго пути не должен быть диском или UNC-именем — ошибка создания подкаталога

У меня есть исключение в третьей строке этого кода "Фрагмент второго пути не должен быть диском или именем UNC"

DirectoryInfo labdi = new DirectoryInfo(Back.mainfolderpath + @"\news\l");
DirectoryInfo tld = new DirectoryInfo(labdi.FullName + @"\" + NorA.sn.labl[i]);
tld = labdi.CreateSubdirectory(labdi.FullName + @"\" + NorA.sn.labl[i] + @"\");

В сети нет полезного способа. Благодарю вас.:!


person Saber MalekzadeH    schedule 03.09.2013    source источник
comment
Что такое NorA.sn.labl[i]?   -  person doctorlove    schedule 03.09.2013
comment
Почему бы вам не использовать System.IO.Path.Combine()?   -  person Heslacher    schedule 03.09.2013
comment
@doctorlove: это строка   -  person Saber MalekzadeH    schedule 03.09.2013
comment
@Heslacher: Какая разница???   -  person Saber MalekzadeH    schedule 03.09.2013
comment
@SaberMalekzadeH, например, буквально строка или тип tring ... если да, то каково это значение? Что-то вроде \\что угодно? или ж:\   -  person doctorlove    schedule 03.09.2013
comment
@SaberMalekzadeH, например, вам не нужно беспокоиться об обратной косой черте.   -  person Heslacher    schedule 03.09.2013


Ответы (3)


Я столкнулся с этим сегодня и, наконец, отследил его.

Исключение пытается сообщить вам, что когда DirectoryInfo принимает путь в качестве аргумента (например, CreateSubdirectory или GetFiles), оно будет возражать, если аргумент пути содержит Root, и выдаст это неуловимое исключение.

Таким образом, аргументы пути, содержащие «C:\» или «D:\» и т. д., не работают. Вооружившись этим контекстом, сообщение об исключении действительно имеет смысл.

В вашем коде вы использовали свойство FullName, и эта строка содержит «C:\» или любой другой корень.

Учитывая возраст вопроса, я должен добавить С#, .NET 4.5, VS2013.

person Community    schedule 23.04.2014
comment
Это описывает, почему это не работает, но каково решение? - person Ciaran Gallagher; 20.01.2020

Самое простое решение этой проблемы — использовать статическую версию методов Directory и File. Вы не должны удалять корень, делая это таким образом. Вам также не нужны объекты DirectoryInfo или FileInfo, они вызывают у вас головную боль.

string someFile = @"C:\somefolder\somefile.txt";
string directory = Path.GetDirectoryName(someFile);

foreach(var file in Directory.GetFiles(directory))
{
   File.Delete(file);
}
person Kelso Sharp    schedule 31.08.2016
comment
В моем случае я не могу использовать статическую версию, потому что новый метод DirectoryInfo() также дает мне FileInfo, чтобы я мог выбрать самый последний файл. Какое решение позволяет избежать использования статических версий этих методов? - person Ciaran Gallagher; 20.01.2020

Решение состоит в том, чтобы не указывать полный путь к файлу в аргументе.

У вас уже есть путь к родительскому каталогу в качестве объекта, поэтому вам нужно только указать имя нового каталога в качестве аргумента.

tld = labdi.CreateSubdirectory(NorA.sn.labl[i]);
person Kelley Robb    schedule 28.01.2021