Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2013.04.28;
Скачать: [xml.tar.bz2];

Вниз

Сравнить два пути к файлу.   Найти похожие ветки 

 
Дмитрий С ©   (2012-10-15 13:38) [0]

Есть FileName1, FileName2:string. Как достоверно определить указывают они на один и тот же файл или нет?
спасибо


 
brother ©   (2012-10-15 13:45) [1]

ээ, применить ansiuppercase для каждого и сравнить?


 
Inovet ©   (2012-10-15 13:45) [2]

ExpandFileName


 
Inovet ©   (2012-10-15 13:55) [3]

> [2] Inovet ©   (15.10.12 13:45)

и
AnsiCompareFileName


 
Jeer ©   (2012-10-15 14:11) [4]


> Как достоверно определить указывают они на один и тот же
> файл или нет?
> спасибо


Сравнить размер, при совпадении - контрольную сумму ( CRC )


 
Дмитрий С ©   (2012-10-15 14:15) [5]


> Jeer ©   (15.10.12 14:11) [4]

А может адрес первого блока? :)


 
Inovet ©   (2012-10-15 14:29) [6]

> [4] Jeer ©   (15.10.12 14:11)

Файлы при этом могут быть разные.


 
RWolf ©   (2012-10-15 14:32) [7]

GetFinalPathNameByHandle() ?


 
Jeer ©   (2012-10-15 16:06) [8]


> А может адрес первого блока? :)


Я всего лишь угадываю Ваши желания :)

Размер файла, уже вычисленная сущность.
Имя файла - тоже.
Дальше остается сравнение по содержимому.
Как - есть много способов.


 
Jeer ©   (2012-10-15 16:07) [9]


> Файлы при этом могут быть разные.


Что такое "разные файлы" ? Название, содержимое, то-се..
Тогда и решение будет конкретным или, наоборот, расплывчатым :)


 
Ega23 ©   (2012-10-15 16:14) [10]


> Что такое "разные файлы" ? Название, содержимое, то-се..
> Тогда и решение будет конкретным или, наоборот, расплывчатым


cmd subst x: d:\temp

Файл d:\temp\1.txt и файл x:\1.txt - суть один и тот же файл.
Вот что-то типа этого и надо сравнить, если я правильно понял вопрос.


 
Jeer ©   (2012-10-15 16:29) [11]

Да я тоже гадаю :)


 
Дмитрий С ©   (2012-10-15 17:02) [12]


> GetFinalPathNameByHandle() ?

То что надо, только смущает, что Vista minimum


 
Dmitriy   (2012-10-15 17:38) [13]


> То что надо, только смущает, что Vista minimum


GetFileInformationByHandle ?

в частности :

nFileIndexHigh The high-order part of a unique identifier that is associated with a file. For more information, see nFileIndexLow. nFileIndexLow
The low-order part of a unique identifier that is associated with a file.

The identifier (low and high parts) and the volume serial number uniquely identify a file on a single computer. To determine whether two open handles represent the same file, combine the identifier and the volume serial number for each file and compare them.


Minimum supported client Windows XP


 
Rouse_ ©   (2012-10-15 19:31) [14]


> Дмитрий С ©   (15.10.12 17:02) [12]
> То что надо, только смущает, что Vista minimum

Ну а в чем проблема то? Открыл хэндл, вызвал NtQueryObject с классом #define ObjectNameInformation  1 , на руки получишь буфер OBJECT_NAME_INFORMATION.

 TUNICODE_STRING = packed record
   Length : WORD;
   MaximumLength : WORD;
   Buffer : array [0..MAX_PATH - 1] of WideChar;
 end;

 POBJECT_NAME_INFORMATION = ^TOBJECT_NAME_INFORMATION;
 TOBJECT_NAME_INFORMATION = packed record
   Name : TUNICODE_STRING;
 end;


Можешь сразу оба буфера сравнивать, ну или приводить его к реальному пути, как это делает GetFinalPathNameByHandle.


 
QAZ2   (2012-10-15 21:10) [15]

а как насчет хард\симлинков и субституты?


 
Rouse_ ©   (2012-10-15 21:21) [16]


> QAZ2   (15.10.12 21:10) [15]
> а как насчет хард\симлинков и субституты?

А что с ними не так?


 
QAZ2   (2012-10-15 21:33) [17]

[14] тоже покажет что это один и тотже файл?


 
Rouse_ ©   (2012-10-15 21:40) [18]


> QAZ2   (15.10.12 21:33) [17]
> [14] тоже покажет что это один и тотже файл?

Ну а куда он денется то?


 
QAZ2   (2012-10-15 21:44) [19]

как куда один файл c:\qqq.txt другой d:\qaz.txt оба линки ,как определить что это один файл?


 
Rouse_ ©   (2012-10-15 21:49) [20]


> QAZ2   (15.10.12 21:44) [19]
> как куда один файл c:\qqq.txt другой d:\qaz.txt оба линки
> ,как определить что это один файл?

омг, ты вообще разбирался как они работают и что за функцию я тебе привел?
Для начала сделай небольшой RTFM потом и спрашивай какой конкретно пункт не понятен...


 
QAZ2   (2012-10-15 22:02) [21]

есть мнение что та функция непоможет :)


 
Rouse_ ©   (2012-10-15 22:11) [22]


> QAZ2   (15.10.12 22:02) [21]
> есть мнение что та функция непоможет :)

Ну ты не стесняйся - пиши код, раз мнение есть :)


 
QAZ2   (2012-10-15 22:14) [23]

у меня в дельфе нет таких функций :(
напиши, буть другом :)


 
Rouse_ ©   (2012-10-15 22:16) [24]


> QAZ2   (15.10.12 22:14) [23]
> у меня в дельфе нет таких функций :(

Печально...


 
kilkennycat ©   (2012-10-16 01:26) [25]


> AnsiCompareFileName

а если файлик на сетевом диске, где никс?


 
Германн ©   (2012-10-16 02:40) [26]

Вот опять "дурацкий" вопрос вместо описания задачи.


 
Inovet ©   (2012-10-16 07:56) [27]

> [25] kilkennycat ©   (16.10.12 01:26)
> а если файлик на сетевом диске, где никс?

А не пофиг из-под Вин?


 
Jeer ©   (2012-10-16 09:52) [28]

Модифицировать какой-либо аттрибут у одного файла и сравнить с другим :)


 
kilkennycat ©   (2012-10-16 11:01) [29]


> Inovet ©   (16.10.12 07:56) [27]

конечно пофиг. просто два одинаковоназванныходинаковопутевых файла, а так - пофиг.


 
QAZ2   (2012-10-16 12:42) [30]


> Для начала сделай небольшой RTFM

и сказал википед про hardlink
"Все ссылки одного файла равноправны и неотличимы друг от друга — нельзя сказать, что файл существует в таком-то каталоге, а в других местах есть лишь их копии"
вот и непонятно как ты определиш что это один файл через GetFinalPathNameByHandle


 
Медвежонок Пятачок ©   (2012-10-16 13:22) [31]

ээ, применить ansiuppercase для каждого и сравнить?


это особенно круто поможет, если это файлы Test.txt и test.txt на линупсовой шаре в одной и той же папке.


 
brother ©   (2012-10-16 13:23) [32]

> на линупсовой шаре

без комментариев!


 
Медвежонок Пятачок ©   (2012-10-16 13:28) [33]

экспандфайлнейм обоим и сравнение регистрозависимое.
плюс файлэкзист обоим (после экспанда) плюс анализ пути до папки.

только так.


 
QAZ4   (2012-10-16 13:35) [34]


> Медвежонок Пятачок ©   (16.10.12 13:28) [33]

а как насчет хард\симлинков и субституты?


 
Медвежонок Пятачок ©   (2012-10-16 13:42) [35]

насчет их все хорошо.


 
QAZ4   (2012-10-16 14:20) [36]

какже хорошо если пути разные?


 
Медвежонок Пятачок ©   (2012-10-16 14:23) [37]

У файлов разные?
Или у файлов-линков разные?
получи физические имена и сравнивай.
и так же хорошо и будет.


 
QAZ4   (2012-10-16 14:39) [38]


> Или у файлов-линков разные?

ага, а файл один и тотже

> получи физические имена и сравнивай

эт какие такие физические


 
Медвежонок Пятачок ©   (2012-10-16 14:57) [39]

это не химические


 
Rouse_ ©   (2012-10-16 14:58) [40]


> QAZ2   (16.10.12 12:42) [30]
> и сказал википед про hardlink

Ну ты нашел авторитетный источник, еще бы в лурке поискал :)
Я ж сказал - напиши код и проверь, че катать с пустого в порожнее?


 
QAZ5   (2012-10-16 15:03) [41]

дык я не понял че писать, ты привел некошерную функцию ее нет в мсдн


 
Дмитрий С ©   (2012-10-16 16:08) [42]


> NtQueryObject

[This function may be changed or removed from Windows without further notice.]


 
MetalFan ©   (2012-10-16 16:17) [43]


> ты привел некошерную функцию ее нет в мсдн

Гы, а MSDN и не в курсе, что в ней не описана <a href="http://msdn.microsoft.com/en-us/library/bb432383%28v=VS.85%29.aspx">эта функция</a>.


 
MetalFan ©   (2012-10-16 16:18) [44]

...мать... забыл, что тут ссылки так не вставишь.


 
Rouse_ ©   (2012-10-16 16:42) [45]


> QAZ5   (16.10.12 15:03) [41]
> дык я не понял че писать, ты привел некошерную функцию ее
> нет в мсдн

Так ты еще и MSDN не смотришь, ну оно и понятно, есть же википедия :)))
Заканчивай тролить, займись полезным делом.


 
QAZ5   (2012-10-16 16:46) [46]

Удалено модератором
Примечание: я буду учить матчасть прежде чем писать глупости...


 
брат Птибурдукова   (2012-10-16 17:08) [47]

так вот чем твой ум разрушили...


 
Дмитрий С ©   (2012-10-16 17:26) [48]

Кстати, а реально какими документрированными (и такими, которые не могут выкинуть без предупреждения) функциями можно узнать путь к файлу по его хендлу? так чтобы и в ХП работало.


 
QAZ5   (2012-10-16 17:46) [49]

Удалено модератором


 
asail ©   (2012-10-16 23:12) [50]

Удалить первый файл, если второй тоже удалился, значит один и тот-же... :)


 
Inovet ©   (2012-10-17 00:59) [51]

> [50] asail ©   (16.10.12 23:12)

С хардлинком второй останется.


 
Германн ©   (2012-10-17 01:32) [52]


> Inovet ©   (17.10.12 00:59) [51]
>
> > [50] asail ©   (16.10.12 23:12)
>
> С хардлинком второй останется.
>

Вот я и говорил, что вопрос неоднозначно сформулирован. И объяснений от автора так и не прозвучало. Что автор подразумевает под словами "один и тот же файл"? Поскольку это может означать как эквивалентность, так и уникальность. А это две большие разницы.


 
kilkennycat ©   (2012-10-17 02:42) [53]


> Что автор подразумевает под словами "один и тот же файл"?

данная фраза трактуется однозначно. это один и тот же файл. его копия в другом месте(под другим именем и т.д.) - это копия, другой файл. а вот если этот файл лежит в одной папке, а потом его переместили в другую - это один и тот же файл, при условии, что файловая система лишь поменяла ссылки. а вот если файловая система его при перемещении переписала на новое физическое место - это другой файл.
именно поэтому телепортация (когда будет сделана), будет использоваться лишь для перемещения чего-нить незначительного, ибо фактически, а значит есть риск, что и юридически вещи и организмы не будут признаны одними и теми же до телепортации и после. но это конечно, если метод телепортации будет в виде уничтожения плазмой (в дешевых плацкартных вариантах - прессом) отправляемого и воссоздании его заново в пункте приема. а вот если его атомы не нарушая структуры через тридесятое измерение и пару складок пространства перенесутся - то все ок, это один и тот же объект. или субъект. или файл.


 
Германн ©   (2012-10-17 03:09) [54]


> kilkennycat ©   (17.10.12 02:42) [53]
>
>
> > Что автор подразумевает под словами "один и тот же файл"?
>
>
> данная фраза трактуется однозначно.

И это говорит Костя, которого не понятно где и как искать! :)


 
kilkennycat ©   (2012-10-17 10:29) [55]


> Германн ©   (17.10.12 03:09) [54]

квип или аська, я почти всегда онлайн


 
QAZ5   (2012-10-17 12:53) [56]


> это один и тот же файл, при условии, что файловая система лишь поменяла ссылки

тогдабы проканало [13] , но индексы могут менятся на усмотрение фс

> а вот если файловая система его при перемещении переписала
> на новое физическое место - это другой файл.

а как по твоему происходит дефрагментация диска? :)


 
kilkennycat ©   (2012-10-17 15:25) [57]

ну, дефрагментация это уже другой процесс, эпизодический. и, получается, что после него нельзя гарантировать, что файлы одни и те же остались, место новое, домены по-новому намагничены, в общем, максимум их можно считать клонами. а клонирование церковью запрещено, по крайней мере, овечек.


 
Jeer ©   (2012-10-17 15:41) [58]

Напридумывали заразной хрени всякой - теперь лечись :)


 
Rouse_ ©   (2012-10-17 16:09) [59]


> Дмитрий С ©   (16.10.12 17:26) [48]
> Кстати, а реально какими документрированными (и такими,
> которые не могут выкинуть без предупреждения) функциями
> можно узнать путь к файлу по его хендлу? так чтобы и в ХП
> работало.

Я ж сказал, NtQueryObject.

А по поводу хардлинков, все файлы в NTFS представлены в виде блока данных где-то в недрах диска + Хардлинк на эти данные, что собственно видно при вызове NtQueryInformationFile с флагом FileStandardInformation, где поле FileInfo.NumberOfLinks будет равно единице. Для примера тот-же калькулятор.
У меня он лежит в оригинале вот тут:
C:\Windows\winsxs\x86_microsoft-windows-calc_31bf3856ad364e35_6.1.7601.17514_none_abc56b2678fe1108\calc.exe + на него висит хардлинк в C:\Windows\System32\calc.exe

симлинки/subst диски NtQueryObject кажет ровно.

Вот такой код:

program Project1;

{$APPTYPE CONSOLE}

uses
 Windows;

type
 NT_STATUS = Cardinal;

 PUNICODE_STRING = ^TUNICODE_STRING;
 TUNICODE_STRING = packed record
   Length : WORD;
   MaximumLength : WORD;
   Buffer : array [0..MAX_PATH - 1] of WideChar;
 end;

 POBJECT_NAME_INFORMATION = ^TOBJECT_NAME_INFORMATION;
 TOBJECT_NAME_INFORMATION = packed record
   Name : TUNICODE_STRING;
 end;

 function NtQueryObject(ObjectHandle: THandle;
   ObjectInformationClass: DWORD; ObjectInformation: Pointer;
   ObjectInformationLength: ULONG;
   ReturnLength: PDWORD): NT_STATUS; stdcall; external "ntdll.dll";

function GetFilePathByHandle(Value: THandle): string;
const
 ObjectNameInformation = 1;
var
 ObjectNameInfo: TOBJECT_NAME_INFORMATION;
 dwReturn: DWORD;
 AnsiBuff: array [0..MAX_PATH - 1] of AnsiChar;
begin
 NtQueryObject(Value, ObjectNameInformation,
   @ObjectNameInfo, MAX_PATH * 2, @dwReturn);
 WideCharToMultiByte(CP_ACP, 0,
   @ObjectNameInfo.Name.Buffer[ObjectNameInfo.Name.MaximumLength -
   ObjectNameInfo.Name.Length],
   ObjectNameInfo.Name.Length, @AnsiBuff[0],
   MAX_PATH, nil, nil);
 Result := string(PAnsiChar(@AnsiBuff[0]));
end;

var
 RealFile, HardLink, SymLink, SubStFile: THandle;
begin
 RealFile := CreateFile("S:\tmp\1\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(RealFile));
 CloseHandle(RealFile);

 HardLink := CreateFile("S:\tmp\1\2\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(HardLink));
 CloseHandle(HardLink);

 SymLink := CreateFile("S:\tmp\1\4\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(SymLink));
 CloseHandle(SymLink);

 SubStFile := CreateFile("J:\1.txt",
   GENERIC_READ, 0, nil, OPEN_EXISTING, 0, 0);
 Writeln(GetFilePathByHandle(SubStFile));
 CloseHandle(SubStFile);

 Readln;
end.


выведет следующую информацию

\Device\HarddiskVolume3\tmp\1\1.txt
\Device\HarddiskVolume3\tmp\1\2\1.txt
\Device\HarddiskVolume3\tmp\1\1.txt
\Device\HarddiskVolume3\tmp\1\1.txt


Сбой только на хардлинке (второй результат), но его легко дереференсить при желании, и кстати GetFinalPathNameByHandle не производит дереференс хардлинка, т.е. им нельзя будет различить что два пути ведут на один и тот-же файл.


 
QAZ5   (2012-10-17 17:36) [60]


> Сбой только на хардлинке (второй результат), но его легко
> дереференсить при желании, и кстати GetFinalPathNameByHandle
> не производит дереференс хардлинка, т.е. им нельзя будет
> различить что два пути ведут на один и тот-же файл.

а я чо говорил


 
Rouse_ ©   (2012-10-17 18:00) [61]


> а я чо говорил

А ты говорил неверные вещи, причем цитировал зачем-то википедию, а потом вообще про драйвера начал (зачем?), при дереференсе можно конкретно определить оригинальное месторасположение файла на которое указывает рутовый линк.


 
QAZ5   (2012-10-17 20:07) [62]

закеш как


 
Rouse_ ©   (2012-10-17 20:56) [63]


> QAZ5   (17.10.12 20:07) [62]
> закеш

Не закежу :)
В семерке отрубили запрос FSCTL_GET_NTFS_FILE_RECORD для неподписаных приложений.
http://msdn.microsoft.com/en-us/library/windows/desktop/aa364568(v=vs.85).aspx
А сидеть вспоминать как читать NTFS в сыром режиме мне лениво :)


 
Rouse_ ©   (2012-10-17 21:02) [64]

За, если интересно, то вот вариант с нулевого кольца: http://www.everfall.com/paste/id.php?uj1hth7un53o
под ХР он транслируется легко в третье.
Под семеркой связку ZwFsControlFile -> DeviceIoControl меняем на RAW


 
QAZ5   (2012-10-17 22:01) [65]


> RAW

какой такой


 
Германн ©   (2012-10-18 01:55) [66]


>  QAZ5   (17.10.12 22:01) [65]
>
>
> > RAW
>
> какой такой
>

Придуриваешься или в самом деле не понимаешь о чем речь?


 
QAZ5   (2012-10-18 11:39) [67]

не ну догадываюсь, но надо конкретики



Страницы: 1 2 вся ветка

Форум: "Начинающим";
Текущий архив: 2013.04.28;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.62 MB
Время: 0.003 c
15-1356468566
KillZBOT
2012-12-26 00:49
2013.04.28
Нужна Контра для Wi-fi сети


15-1356650625
ННН
2012-12-28 03:23
2013.04.28
Где находится IE?


15-1356769502
Undertacker
2012-12-29 12:25
2013.04.28
Как прочитать сохраненные файлы Оперы-мини?


2-1350458591
thely
2012-10-17 11:23
2013.04.28
Аккуратный выход


15-1356364173
Es
2012-12-24 19:49
2013.04.28
ADO, ошибка в провайдере MSDAORA при select... for update





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский