A>Открой исходный файл на чтение с запретом на параллельную запись и оно само получится
Оно понятно, что можно ловить исключения или как-то вот так используя вариант "не даст" =)
Но всё же было бы идеально получить какое-то каноническое имя файла или путь.
Вот например как получить из файла (например file1.txt) его название в ФС с учётом регистра (File1.txt) ?
Здравствуйте, arbidol, Вы писали:
A>Оно понятно, что можно ловить исключения или как-то вот так используя вариант "не даст" =)
Это в любом случае придётся делать, учитывая что файл может быть "занят".
A>Но всё же было бы идеально получить какое-то каноническое имя файла или путь.
Нет такого
A>Вот например как получить из файла (например file1.txt) его название в ФС с учётом регистра (File1.txt) ?
которое?
\\mypc\\share\file1.txt
\\.\C:\my folder\file1.txt
C:\my folder\file1.txt
C:\myfold~1\file1.txt
C:\my folder\file2.txt // Символическая ссылка, приплыли.
C:\my folder\file3.txt // Ещё символическая ссылка. Хоть убейся, но это один и тот же файл.
C:\my folder 2\file1.txt // А вот и папочка сослалась.
D:\his folder\file1.txt // Ещё символическая ссылка. Даже диск другой.
Да про ссылки согласен. Правда как я понимаю в NTFS нет понятия несимволических ссылок, т.е. имя файла (без пути) таки у каждой записи в таблице файлов вполне определённое.
Ну и это не суть.
Всё ж где-то в душе надеюсь что есть какой-то идентификатор в файловой системе для файла, по которому можно отследить что есть что.
А потом уже блокировать на запись и продолжать пытаться перезаписать.
Здравствуйте, arbidol, Вы писали:
A>Всё ж где-то в душе надеюсь что есть какой-то идентификатор в файловой системе для файла, по которому можно отследить что есть что.
Вы можете открыть файл, а потом вызвать GetFileInformationByHandle. В возвращаемой структуре есть идентификатор файла. Этот идентификатор + идентификатор тома однозначно идентифицируют этот файл пока вы держите хэндл файла открытым.
Здравствуйте, Alex Fedotov, Вы писали:
AF>Вы можете открыть файл, а потом вызвать GetFileInformationByHandle. В возвращаемой структуре есть идентификатор файла. Этот идентификатор + идентификатор тома однозначно идентифицируют этот файл пока вы держите хэндл файла открытым.
Так не будет работать. C:\File1.txt и ссылка D:\File2.txt будут считаться разными.
Здравствуйте, arbidol, Вы писали:
A>Как определить что file1 и file2 указывают на один и тот же файл?
Uri p1 = new Uri(@"C:\goodDay\ggg.txt");
Uri p2 = new Uri(@"file://c:\goodDay\some\..\..\GOODDAY\ggg.txt");
int v = Uri.Compare(p1, p2, UriComponents.AbsoluteUri, UriFormat.SafeUnescaped, StringComparison.InvariantCultureIgnoreCase);
Здравствуйте, arbidol, Вы писали:
A>Допустим есть A>FileInfo file1 = new FileInfo("C:\MyFile.txt") A>FileInfo file2 = new FileInfo("c:\myfile.TXT")
A>Как определить что file1 и file2 указывают на один и тот же файл?
A>У меня напрашивается только вариант со сравнением их свойства FullPath (с IgnoreCase).
A>Но тогда, например это не охватывает такой вариант как: A>C:\Program Files\1.txt A>и A>C:\Progra~1\1.txt
A>что тоже является одним файлом =(
А чем не устраивает вариант
Path.GetFullPath("..");
или, для ASP.NET
Request.MapPath("~\\TestFile.txt");
по-моему они как раз для канонизации имени файла придуманы
Здравствуйте, MatFiz, Вы писали: MF>После выполнения этого кода значение v равно 0.
Да, наверное это самый правильный вариант.Спасибо.
Но всё равно придётся открывать и блокировать файл дополнительно.
Разных ссылки на файл/каталог/устройства и т.п. не избежать.
T>а что такое канонизация? Разве не определение абсолютного пити и имени файла? T>ене пойму чем плох Path.GetFullPath() ...
GetFullPath вернёт для одно и того же файла c:\test.txt и C:\Text.TXT два разный значения.
Канонической имя подразумевает однозначность.
Здравствуйте, arbidol, Вы писали:
T>>а что такое канонизация? Разве не определение абсолютного пити и имени файла? T>>ене пойму чем плох Path.GetFullPath() ... A>GetFullPath вернёт для одно и того же файла c:\test.txt и C:\Text.TXT два разный значения. A>Канонической имя подразумевает однозначность.
Странно.... У меня в проводнике есть папка, а в ней — файл xml.xml
попробовал там же создать (проводник, copy/paste -> rename) файл xMl.xml — не получилось, получил предложение подумать над другим именем файла.
Значит в реальности, и путь, и имя файла — case-insensitive ?