Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Проверка целостности файлов, Работа с файлами 
V
    Опции темы
davandr
Дата 5.6.2006, 00:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 25.10.2005
Где: Украина, Харьков

Репутация: нет
Всего: нет



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


--------------------
PM MAIL   Вверх
Sunvas
Дата 5.6.2006, 01:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Соль и сахар
****


Профиль
Группа: Участник
Сообщений: 3388
Регистрация: 12.3.2006
Где: Тосно

Репутация: 28
Всего: 89



Можно попробовать поэкспериментровать с контрольной суммой. 


--------------------
Воспитывая детей по своему образу и подобию, родители почему-то надеются, что они будут лучше их.
PM MAIL   Вверх
Mechanic
Дата 5.6.2006, 01:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



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;


Ну, типа такого. 
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Akella
Дата 5.6.2006, 08:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



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


Бывалый
*


Профиль
Группа: Участник
Сообщений: 246
Регистрация: 27.5.2006
Где: U.S.A. :-)

Репутация: нет
Всего: 0



Самое главное определить типизированный файл или нетипизированный smile  
--------------------
Как вы относитесь к девушкам, которые курят сигареты?Как не ослепнуть за компьютером© ORENCODE.info
PM MAIL WWW   Вверх
bems
Дата 6.6.2006, 12:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 3400
Регистрация: 5.1.2006

Репутация: 31
Всего: 88



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


--------------------
Обижено школьников: 8
PM MAIL   Вверх
Mechanic
Дата 6.6.2006, 22:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



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

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

А вообще, есть очень надёжный способ проверки файла - бинарная сверка файла с его эталонной копией.  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
Poseidon
Дата 7.6.2006, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 53
Всего: 133



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

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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Mechanic
Дата 7.6.2006, 01:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 5.5.2006
Где: Kharkov, Ukraine

Репутация: 6
Всего: 7



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


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

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

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

Заметим, в сабже ни слова не сказано, о том, какого рода повреждения необходимо детектить, какого рода данные в файлах, какие есть критерии оценки целостности, .. ничего нет.  smile 
Что бы здесь терь в каментах не предлагалось, всё будет чистейшей воды демагогией [словоблудием], и субъективными измышлениями... Ну, в лучшем случае - это просто мозговой штурм!  smile  
--------------------
Tell me the extensions of the files You backup and I'll tell You who You are..  ©Mch  
PM   Вверх
davandr
Дата 7.6.2006, 11:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 304
Регистрация: 25.10.2005
Где: Украина, Харьков

Репутация: нет
Всего: нет



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


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0650 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.