Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 15.09.07 00:24
Оценка:
Допустим есть
FileInfo file1 = new FileInfo("C:\MyFile.txt")
FileInfo file2 = new FileInfo("c:\myfile.TXT")

Как определить что file1 и file2 указывают на один и тот же файл?

У меня напрашивается только вариант со сравнением их свойства FullPath (с IgnoreCase).

Но тогда, например это не охватывает такой вариант как:
C:\Program Files\1.txt
и
C:\Progra~1\1.txt

что тоже является одним файлом =(
Re: Как правильно сравнить два FileInfo
От: adontz Грузия http://adontz.wordpress.com/
Дата: 15.09.07 00:27
Оценка:
Здравствуйте, arbidol, Вы писали:

Зачем это? Какая задача? У файла можно создать практически бесконечно количество имён каждое из которых будет ссылатся на один и тот же файл.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[2]: Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 15.09.07 00:32
Оценка:
Задача такая:
Пользователь даёт имя файла (в любом виде)
И даёт директорию (в любом виде)

Задача найти в дирекотрии все файлы с таким же именем и заменить его на файл.

А проблема как раз вырисовывается в том, чтобы не пытаться переписать файл сам на себя.
Re[3]: Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 15.09.07 00:33
Оценка:
A>Задача найти в дирекотрии все файлы с таким же именем и заменить его на файл.
"Заменить _ИХ_" в смысле
Re[3]: Как правильно сравнить два FileInfo
От: adontz Грузия http://adontz.wordpress.com/
Дата: 15.09.07 00:36
Оценка:
Здравствуйте, arbidol, Вы писали:

A>А проблема как раз вырисовывается в том, чтобы не пытаться переписать файл сам на себя.


Открой исходный файл на чтение с запретом на параллельную запись и оно само получится
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[4]: Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 15.09.07 00:40
Оценка:
A>Открой исходный файл на чтение с запретом на параллельную запись и оно само получится
Оно понятно, что можно ловить исключения или как-то вот так используя вариант "не даст" =)

Но всё же было бы идеально получить какое-то каноническое имя файла или путь.

Вот например как получить из файла (например file1.txt) его название в ФС с учётом регистра (File1.txt) ?
Re[5]: Как правильно сравнить два FileInfo
От: adontz Грузия http://adontz.wordpress.com/
Дата: 15.09.07 00:45
Оценка:
Здравствуйте, 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 // Ещё символическая ссылка. Даже диск другой.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re[6]: Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 15.09.07 00:51
Оценка:
Да про ссылки согласен. Правда как я понимаю в NTFS нет понятия несимволических ссылок, т.е. имя файла (без пути) таки у каждой записи в таблице файлов вполне определённое.

Ну и это не суть.
Всё ж где-то в душе надеюсь что есть какой-то идентификатор в файловой системе для файла, по которому можно отследить что есть что.
А потом уже блокировать на запись и продолжать пытаться перезаписать.
Один файл или разные?
От: Alex Fedotov США  
Дата: 15.09.07 01:38
Оценка: 85 (2)
#Имя: FAQ.winapi.file.id
Здравствуйте, arbidol, Вы писали:

A>Всё ж где-то в душе надеюсь что есть какой-то идентификатор в файловой системе для файла, по которому можно отследить что есть что.


Вы можете открыть файл, а потом вызвать GetFileInformationByHandle. В возвращаемой структуре есть идентификатор файла. Этот идентификатор + идентификатор тома однозначно идентифицируют этот файл пока вы держите хэндл файла открытым.
-- Alex Fedotov
Re[8]: Как правильно сравнить два FileInfo
От: adontz Грузия http://adontz.wordpress.com/
Дата: 15.09.07 10:19
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

AF>Вы можете открыть файл, а потом вызвать GetFileInformationByHandle. В возвращаемой структуре есть идентификатор файла. Этот идентификатор + идентификатор тома однозначно идентифицируют этот файл пока вы держите хэндл файла открытым.


Так не будет работать. C:\File1.txt и ссылка D:\File2.txt будут считаться разными.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Как правильно сравнить два FileInfo
От: MatFiz Россия  
Дата: 15.09.07 10:55
Оценка: 3 (1)
Здравствуйте, 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);


После выполнения этого кода значение v равно 0.
How are YOU doin'?
Re[9]: Как правильно сравнить два FileInfo
От: Alex Fedotov США  
Дата: 15.09.07 16:06
Оценка:
Здравствуйте, adontz, Вы писали:

A>Так не будет работать. C:\File1.txt и ссылка D:\File2.txt будут считаться разными.


Почему?
-- Alex Fedotov
Re[10]: Как правильно сравнить два FileInfo
От: adontz Грузия http://adontz.wordpress.com/
Дата: 15.09.07 16:31
Оценка:
Здравствуйте, Alex Fedotov, Вы писали:

A>>Так не будет работать. C:\File1.txt и ссылка D:\File2.txt будут считаться разными.

AF>Почему?

Ступил, сорри. Будет.
A journey of a thousand miles must begin with a single step © Lau Tsu
Re: Как правильно сравнить два FileInfo
От: tol05  
Дата: 16.09.07 14:20
Оценка:
Здравствуйте, 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");

по-моему они как раз для канонизации имени файла придуманы
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[2]: Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 16.09.07 14:49
Оценка:
Здравствуйте, MatFiz, Вы писали:
MF>После выполнения этого кода значение v равно 0.

Да, наверное это самый правильный вариант.Спасибо.
Но всё равно придётся открывать и блокировать файл дополнительно.
Разных ссылки на файл/каталог/устройства и т.п. не избежать.
Re[2]: Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 16.09.07 14:51
Оценка:
T>А чем не устраивает вариант
T>
T>Path.GetFullPath("..");
T>

T>или, для ASP.NET
T>
T>Request.MapPath("~\\TestFile.txt");
T>

T>по-моему они как раз для канонизации имени файла придуманы

Нет, не для канонизации никак =) А просто чтобы получить полный путь =)
К тому же не ASP.NET задача
Re[3]: Как правильно сравнить два FileInfo
От: tol05  
Дата: 17.09.07 11:37
Оценка:
Здравствуйте, arbidol, Вы писали:

A>Нет, не для канонизации никак =) А просто чтобы получить полный путь =)

A>К тому же не ASP.NET задача

а что такое канонизация? Разве не определение абсолютного пити и имени файла?
ене пойму чем плох Path.GetFullPath() ...
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Как правильно сравнить два FileInfo
От: lonli Беларусь  
Дата: 17.09.07 13:52
Оценка:
Здравствуйте, arbidol, Вы писали:

Я верхнюю ветку посмотрел и сначала решил что человек сам с собой разговаривает, так ники похожи
Стареть скучно, но это единственный способ жить долго. ©Ф.Раневская
Re[4]: Как правильно сравнить два FileInfo
От: arbidol http://www.9rays.net/
Дата: 17.09.07 14:36
Оценка: 1 (1)
T>а что такое канонизация? Разве не определение абсолютного пити и имени файла?
T>ене пойму чем плох Path.GetFullPath() ...
GetFullPath вернёт для одно и того же файла c:\test.txt и C:\Text.TXT два разный значения.
Канонической имя подразумевает однозначность.
Re[5]: Как правильно сравнить два FileInfo
От: tol05  
Дата: 17.09.07 14:49
Оценка:
Здравствуйте, arbidol, Вы писали:

T>>а что такое канонизация? Разве не определение абсолютного пити и имени файла?

T>>ене пойму чем плох Path.GetFullPath() ...
A>GetFullPath вернёт для одно и того же файла c:\test.txt и C:\Text.TXT два разный значения.
A>Канонической имя подразумевает однозначность.

Странно.... У меня в проводнике есть папка, а в ней — файл xml.xml
попробовал там же создать (проводник, copy/paste -> rename) файл xMl.xml — не получилось, получил предложение подумать над другим именем файла.
Значит в реальности, и путь, и имя файла — case-insensitive ?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.