Уникальный индентификатор файла.

Вопросы программирования на Free Pascal, использования компилятора и утилит.

Модератор: Модераторы

Уникальный индентификатор файла.

Сообщение Сквозняк » 10.01.2018 07:39:43

С появлением файловых систем с символическими ссылками, один и тот-же файл или каталог поиском по маске функциями findfirst и findnext за один раз можно найти несколько раз. По имени файла и его пути уже гарантированно не определить, обрабатывался этот файл или нет. И чтобы обработать найденные файлы по одному разу, нужно найти у файлов другую "кличку" нежели имя и путь: полный реальный путь с именем, номер в файловой системе, уникальный указатель или что-то ещё. Что это может быть и как это добыть?
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Уникальный индентификатор файла.

Сообщение LearnMagic » 10.01.2018 09:08:18

Для поиска желательно использовать FindFirstUtf8
Проверка на символическую ссылку: TSearchRec.Attr and faSymLink, где faSymLink = $00000040
LearnMagic
новенький
 
Сообщения: 66
Зарегистрирован: 10.11.2016 23:13:38

Re: Уникальный индентификатор файла.

Сообщение Сквозняк » 10.01.2018 17:17:54

FindFirstUtf8 это же из лазаруса, в модулях fpc его нет. Если кодировка консоли совпадает с системной кодировкой, то и FindFirst будет нормально искать - какой набор байтов утилита получила, такой и надо найти.

С проверкой на символическую ссылку, не понял, как мне это поможет. Ну обнаружу я что найденный файл символическая ссылка, но так у меня же не стоит цель не работать именно с символическими ссылками. Мне нужно обработать все найденные файлы по одному разу, а в результатах поиска может не быть настоящего имени файла, тогда получится что вместо 2 и более раз, найденный файл обработается 0 раз, это тоже неправильно.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Уникальный индентификатор файла.

Сообщение olegy123 » 10.01.2018 20:12:41

Сквозняк писал(а):полный реальный путь с именем
Если в системе Linux то есть функция:
http://man7.org/linux/man-pages/man3/realpath.3.html
которая дает абсолютный реальный полный путь к реальному файлу.

Добавлено спустя 1 минуту 5 секунд:
есть еще шел команда realpath - можете проверить.
Последний раз редактировалось olegy123 10.01.2018 20:15:32, всего редактировалось 1 раз.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Уникальный индентификатор файла.

Сообщение Сквозняк » 10.01.2018 20:14:21

В дельфи для получения имя файла, на которое ссылается симлинк есть функция System.IOUtils.TFile.getSymLinkTarget() а в паскале нашёл только вызов системной утилиты readlink

Добавлено спустя 14 минут 11 секунд:
olegy123 писал(а):Если в системе Linux то есть функция:http://man7.org/linux/man-pages/man3/realpath.3.htmlкоторая дает абсолютный реальный полный путь к реальному файлу.

Это утилита или функция в Си?
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Уникальный индентификатор файла.

Сообщение olegy123 » 10.01.2018 21:16:55

Это функция от ядра. POSIX стандарт. В винде пишут про функцию GetFullPathName.
Вообще разные файловые системы могут/не могут симлинки предоставлять. Например их нет в FAT-е.
В ntfs, ext4/ext3, bfs ..др - они могут по разному назначаться.. Ядро дает общее представление.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Уникальный индентификатор файла.

Сообщение Сквозняк » 10.01.2018 21:25:16

Для вызовов функций ядра в модуле unix ничего универсального не придумано?
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Уникальный индентификатор файла.

Сообщение olegy123 » 10.01.2018 21:29:36

Это POSIX стандарт - что может быть более универсальнее?

Добавлено спустя 6 минут 52 секунды:
гугл дал ответ
uses FileUtil;
ReadAllLinks
http://lazarus-ccr.sourceforge.net/docs ... links.html
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Уникальный индентификатор файла.

Сообщение Сквозняк » 10.01.2018 21:38:11

Так в том то и дело что я с POSIX напрямую не общался и он мне в линуксе в общем-то и не интересен был. Без понятия, как вызвать его функцию из паскаля. Есть конечно вариант переделать файл заголовка в модуль импорта, но может в паскале для вызова realpath или readlink предусмотрено что-то получше?
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Уникальный индентификатор файла.

Сообщение olegy123 » 10.01.2018 21:49:15

посмотрел
relapath точка входа в libc

все просто должно быть..
char *realpath(const char *path, char *resolved_path); переводится в
function realpath(const path:pchar;resolved_path:pchar):pchar;cdecl;external 'c';
Последний раз редактировалось olegy123 10.01.2018 21:51:16, всего редактировалось 1 раз.
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Уникальный индентификатор файла.

Сообщение Сквозняк » 10.01.2018 21:51:07

olegy123 писал(а):uses FileUtil;

Это наверно новый модуль, лазарус 1.6.4 его не знает, а 1.8.0-0 не использую из-за глючности его окна редактора - никак не побороть без заглядывания в код двойной набор символов в окне. Если только ReadAllLinks в исходниках расковырять - вдруг не сложно реализован.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Уникальный индентификатор файла.

Сообщение olegy123 » 10.01.2018 21:55:58

lazarus/components/lazutils/fileutil.pas
он описан в Lazarus-е

function ReadAllLinks(const Filename: string; ExceptionOnError: boolean): string; inline; deprecated 'Use the function in LazFileUtils unit';

Добавлено спустя 3 минуты 2 секунды:
нужно
uses LazFileUtils;

там есть
function ReadAllLinks(const Filename: string;
{%H-}ExceptionOnError: boolean): string; // if a link is broken returns ''
function TryReadAllLinks(const Filename: string): string; // if a link is broken returns Filename
olegy123
долгожитель
 
Сообщения: 1643
Зарегистрирован: 25.02.2016 12:10:20

Re: Уникальный индентификатор файла.

Сообщение Сквозняк » 10.01.2018 22:27:17

Вот только в старом, лазарусе, в котором буквы не двоятся, модуль LazFileUtils не хочет работать, хотя вроде компонент и установлен. В конечном счёте всё свелось к модулю baseunix, хотя бы поиск в 1.8.0 как-то сработал.
Код: Выделить всё
uses baseunix;

begin
writeln(fpReadLink('имя_симлинка'));
end.
Сквозняк
энтузиаст
 
Сообщения: 1109
Зарегистрирован: 29.06.2006 22:08:32

Re: Уникальный индентификатор файла.

Сообщение MysticCoder » 11.01.2018 07:09:43

Сквозняк писал(а):никак не побороть без заглядывания в код двойной набор символов в окне


попробуй перед запуском лазаруса ставить английскую раскладку.
MysticCoder
постоялец
 
Сообщения: 154
Зарегистрирован: 14.09.2013 00:20:28

Re: Уникальный индентификатор файла.

Сообщение sign » 11.01.2018 07:42:57

Сквозняк писал(а):Вот только в старом, лазарусе, в котором буквы не двоятся

:shock:
Как вы такого сумели добиться?
Почему у меня не двоятся? v1.8.0
sign
энтузиаст
 
Сообщения: 1131
Зарегистрирован: 30.08.2009 09:20:53

След.

Вернуться в Free Pascal Compiler

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 29

Рейтинг@Mail.ru