Re[9]: Нереальный баг
От: Sinix  
Дата: 30.08.16 08:09
Оценка:
Здравствуйте, 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 тут ни при чём, эт авторы архива извратились.
Re[10]: Нереальный баг
От: DreamMaker  
Дата: 30.08.16 11:23
Оценка: +1
Здравствуйте, Sinix, Вы писали:

DM>>в юниксе/маке небось это ж допустимые имена?

S>Мы ж не юникс/мак обсуждаем Аргументация из серии "почему шарп не умеет в отступы вместо скобочек? Питон же справляется".

возможно архив делался на юниксе/маке, это тогда объясняет почему так вышло.
там имена файлов — фамилии с именами. у некоторых — инициалы. вот точка в конце и "сработала".
In P=NP we trust.
Re[11]: Нереальный баг
От: Sinix  
Дата: 30.08.16 14:42
Оценка: 6 (2)
Здравствуйте, 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." для разминки. Удачи
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.