Здравствуйте, DreamMaker, Вы писали:
DM>не я их создал. у меня программа (моя) повалилась на папке с файлами где несколько имели такие имена.
Ну да, если кто-то использовал extended-length path, то остальной софт тож должен использовать подходящее API для работы с длинными / формально невалидными путями. Ибо
For file I/O, the "\\?\" prefix to a path string tells the Windows APIs to disable all string parsing and to send the string that follows it straight to the file system.
...
Many but not all file I/O APIs support "\\?\"; you should look at the reference topic for each API to be sure.
(с)
DM>в юниксе/маке небось это ж допустимые имена?
Мы ж не юникс/мак обсуждаем
Аргументация из серии "почему шарп не умеет в отступы вместо скобочек? Питон же справляется".
DM>по любому, было бы сильно логичнее, раз уж открыть их невозможно, не давать их создавать. тогда бы винрар дал бы ошибку и не пришлось бы терять время.
Их надо очень постараться, чтоб создать. Сам WinRar тут ни при чём, эт авторы архива извратились.
Здравствуйте, Sinix, Вы писали:
DM>>в юниксе/маке небось это ж допустимые имена?
S>Мы ж не юникс/мак обсуждаем Аргументация из серии "почему шарп не умеет в отступы вместо скобочек? Питон же справляется".
возможно архив делался на юниксе/маке, это тогда объясняет почему так вышло.
там имена файлов — фамилии с именами. у некоторых — инициалы. вот точка в конце и "сработала".
Здравствуйте, DreamMaker, Вы писали:
DM>возможно архив делался на юниксе/маке, это тогда объясняет почему так вышло.
DM>там имена файлов — фамилии с именами. у некоторых — инициалы. вот точка в конце и "сработала".
UPD. Чот я поленился пруфы выложить к первому ответу. Исправляю. Код на коленке слабан за 5 минут, сами поправите
Таргетинг на 4.6.2 (ну и
сам 4.6.2, понятное дело) обязательны.
static void Main(string[] args)
{
Directory.CreateDirectory(@"d:\1\");
File.WriteAllText(@"d:\1\test1.file.", "helloworld1");
File.WriteAllText(@"\\?\d:\1\test2.file.", "helloworld2");
foreach (var item in Directory.EnumerateFiles(@"d:\1\"))
{
Console.WriteLine(item);
try
{
Console.WriteLine(" - " + File.ReadAllText(item));
}
catch (FileNotFoundException)
{
Console.WriteLine(" -(full path)- " + File.ReadAllText(@"\\?\" + item));
}
}
Console.WriteLine("Press any key to delete d:\\1 dir");
Console.ReadKey();
File.Move(@"\\?\d:\1\test2.file.", @"\\?\d:\1\test2.file.someext");
Directory.Delete(@"\\?\d:\1", true);
Console.WriteLine("done.");
Console.ReadKey();
}
Почему так делать — плохая идея: попробуйте не "Press any key to delete d:\1 dir", а почистить папку ручками
| спойлер |
| Штатный проводник даже в win10 anniversary не даст. И переименовать файлы тож не получится. |
| |
Если приседания с чтением содержимого файла не впечатлили и есть желания узнать "почему так делать не надо" сложным путём — попробуйте получить корректный полный путь из кривого относительного пути.
Из "
d:\1\2\..\test2.file." для разминки. Удачи