Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Проверка целостности файлов


Автор: davandr 5.6.2006, 00:49
Всем привет. 
Пишу утилиту для работы с файлами. 
Возникла такая задачка: необходимо проверять целостность файла, т.е. 
проверять не поврежден ли он или не испорчен. Пока что я просто пытаюсь 
скопировать его в другой файл, но думаю, что это не совсем правильно. 
Хочу узнать вашего мнения. 

Автор: Sunvas 5.6.2006, 01:02
Можно попробовать поэкспериментровать с контрольной суммой. 

Автор: Mechanic 5.6.2006, 01:27
copy /b filename.ext nul
Nul - это такой девайс, который молча съедает всё, что в него суют. А если при чтении возникает ошибка, то она возникает..  smile  Просто, если использовать nul, то не нужно создавать другой файл.
А вообще, проще читать файл блоками в память.
Только такая проверка - скорее проверка физического носителя.

Код

function FileReadCheckOK(const filename: string): boolean;
var f: integer; Buffer: PChar; Sz, WasRead, ToRead: int64;
begin
    Result := false;
    f := FileOpen(filename, fmOpenRead or fmShareDenyNone);
    if f < 0 then exit; //error
    Sz := FileSeek(f, 0, soFromEnd);
    FileSeek(f, 0, soFromBeginning);
  try
    Buffer := PChar(AllocMem(FileReadBufSize+1));
    WasRead := 0;
    while WasRead < Sz do
    begin
        ToRead := FileReadBufSize;
        if ToRead > Sz - WasRead then
         ToRead := Sz - WasRead;
        if ToRead <> FileRead(f, Buffer, ToRead) then Break; //error

        WasRead := WasRead + ToRead;
    end;
    Result := WasRead = Sz;
  finally
    FileClose(f);
    FreeMem(Buffer);
  end;
end;


Ну, типа такого. 

Автор: Akella 5.6.2006, 08:41
для этого нужно знать формат файла, конкретного каждого файла, иначе как проверить, что у него ДОЛЖНО БЫТЬ "внутри"?
А CRC проверяется после копирования, для сравнения 2х копий файла: исходного и скопированного.
тоже самое и с Nul - можно выявить преблемы на диске, а не проблемы с внутренностями файла, т.к. скопировается всё, что угодно.
К примеру, возьми копию любоого exe-файла, открой его на редактирование (F4) Far`ом, измени там его-нибудь и попробуй запустить. Винда выдаст ошибку, файл неправильный, так сказать, а теперь попробуй этот "неправильный" файл скопировать на дискету, в Nul, всё скопируется, аж бегом smile  

Автор: ConstantinXXX 5.6.2006, 21:03
Самое главное определить типизированный файл или нетипизированный smile  

Автор: bems 6.6.2006, 12:16
Цитата(ConstantinXXX @  5.6.2006,  21:03 Найти цитируемый пост)
Самое главное определить типизированный файл или нетипизированный 
Эти различия есть только в исходном коде программы, исползьзующей старый паскалёвский способ работы с файлами. В более новых исходниках и в скомпилированой программе максимум что можно различать - текстовый или двоичный. А типиз. и не типиз. файлы - это только твои методы работы с ними, а не свойство какого-то конкретного файла.
 

Автор: Mechanic 6.6.2006, 22:48
Цитата(bems @  6.6.2006,  12:16 Найти цитируемый пост)
Эти различия есть только в исходном коде программы..

Купился.. smile  Эт ConstantinXXX, просто на свою тему намекает.. 

А вообще, есть очень надёжный способ проверки файла - бинарная сверка файла с его эталонной копией.  smile  

Автор: Poseidon 7.6.2006, 00:03
Задача неподьемная.
Почаму?
Цитата(Akella @  5.6.2006,  08:41 Найти цитируемый пост)
для этого нужно знать формат файла, конкретного каждого файла, иначе как проверить, что у него ДОЛЖНО БЫТЬ "внутри"?
 Вот! Мы можем зашит самые распрастраненные форматы, но это все равно будут не все форматы. Тем более "распространенный" тоже ОЧЕНЬ много. Все их зашить трудновато. А не зная что должно быть внутри файла и как оно там должно быть, проверить целостность не получится. К примеру, не зная формата .doc, мы не мсожем проверить, повлежден-ли документ или нет, пока не запустим Ворд. Никаким копированием. Для копирования это просто набор байт и ему все равно, как они там распологаются, правильно или нет. А вот Ворду уже не все-равно. Сверка с эталоном и использования контрольной суммы тоже не катит. Запуска. я эту прогу у себя впервые, о каких эталонах может быть речь? И откуда проге знать, какая контрольная сумма должна быть у файла что бы он был не поврежден?

В общем нужно распознавать формат (и скорее всего распознавать по содержанию, а не по расширению) и проверят в соответствии с форматом, поврежден файл или нет. А это одному не под силу.
 

Автор: Mechanic 7.6.2006, 01:08
Цитата(Poseidon @  7.6.2006,  00:03 Найти цитируемый пост)
Сверка с эталоном и использования контрольной суммы тоже не катит. Запуска. я эту прогу у себя впервые, о каких эталонах может быть речь? И откуда проге знать, какая контрольная сумма должна быть у файла что бы он был не поврежден?


Тогда нужно определиться ещё и с семантикой слова "повреждён"..  smile 
Можно же предположить, что файл - это нечто объективное, что существует в своем текущем виде независимо от того, как его могли бы [или собираются] интерпретировать.  Такой файл есть нормальный, и целостный. Для того, чтобы его повредить, нужно его каким-то образом изменить. Допустим, имеется копия эталонного файла, неповрежденность которой и проверяем. Тогда только сравнением. Если же такой копии нет, и нет данных об изменениях файла, то просто невозможно судить о его корректности.

Пример: файл корректен, если он содержит строку в ASCII коде, с терминатором строки CRLF, но содержит неточные координаты южного полюса?  smile 

И вообще, как можно анализировать данные, формат которых не известен? Этакого TCustomFile? smile  Уверен, треугольных, или неправильной формы, или разного размера битов там не будет!

Заметим, в сабже ни слова не сказано, о том, какого рода повреждения необходимо детектить, какого рода данные в файлах, какие есть критерии оценки целостности, .. ничего нет.  smile 
Что бы здесь терь в каментах не предлагалось, всё будет чистейшей воды демагогией [словоблудием], и субъективными измышлениями... Ну, в лучшем случае - это просто мозговой штурм!  smile  

Автор: davandr 7.6.2006, 11:30
Подразумевалась всего лишь проверка на возможность чтения файла с физического носителя. Поянятно, что реализовать проверку формата файла - это задача, которую "на арапа" не возьмешь. ))
Большое всем спасибо за участие. 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)