Функция Createfile

Тема в разделе "Delphi - FAQ", создана пользователем Vadik(R), 29 июл 2010.

  1. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Для чего нужен 4 параметр в этой функции IpSecurityAttributes: PSecurityAttributes?
    Нормального описания нигде не найду. Везде в примерах его ставят в nil, но в одном источнике написано, что он не дает дочерним процессам приложения получить доступ к дескриптору файла, а в другом источнике, наоборот, что дает доступ.
    И предпоследний параметр dwFlagsAndAttributes.
    Какое значение лучше всего ставить, и как он влияет на выполнение функции?
    Собственно, мне надо файл открыть, а аттрибуты не изменять. То есть если он был архивным, то пускай таким и остается.
    Или он наоборот, если файл не архивный, а я укажу значение FILE_ATTRIBUTE_ARCHIVE, он мне не откроет файл у которого аттрибут архивный??
    Пожалуйста, объясните по-подробней, как работает эта функция.
     
  2. vital

    vital Больной Компом Детектед
    Команда форума Web Team

    Регистрация:
    29 янв 2006
    Сообщения:
    2.470
    Симпатии:
    27
  3. Vadik(R)

    Vadik(R) Well-Known Member

    Регистрация:
    12 дек 2007
    Сообщения:
    483
    Симпатии:
    0
    Последний вопрос хотел задать по теме WinAPI функций работы с файлами.
    Я бы и не заморачивался с ними работать, но меня расстроила неправильная работа функции filesize для файлов больше 4 Гб.
    Узнал про функцию getfilesize. Узнал также, что чтобы правильно работала функция getfilesize для больших файлов, надо открывать файл с помощью CreateFile.
    В общем, размер больших файлов определяется правильно, проверял на 6 Гб образах игр и сравнивал с известным значением благодаря винде =)
    Вот, теперь последнее, что беспокоит, правильно ли работает функция ReadFile для больших файлов. То есть точно она их считывает до конца? Или может тут тоже свои нюансы есть. Вот, в общем, мой код, где я читаю файл от начала до конца. Хотел узнать, действительно ли файл считывается полностью и до конца в результате выполнения кода:
    Код (Text):
    function CompareFile(name1: ansistring; name2: ansistring): integer;
    const
    block = 512 * 1024 * 1024;
    var
    f1: THandle;
    f2: THandle;
    content1: array [1..block] of byte;
    content2: array [1..block] of byte;
    bytes: dword;
    i: integer;
    j: integer;
    s: int64;
    s1: int64;
    s2: int64;
    begin
    result := 0;
    f1 := createfile(pchar(name1), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    f2 := createfile(pchar(name2), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    s1 := getfilesize(f1, @s);
    s1 := s1 + s shl 32;
    s2 := getfilesize(f2, @s);
    s2 := s2 + s shl 32;
    if s1 <> s2 then
    result := 1
    else
    begin
    for i := 1 to s1 div block do
    begin
    Application.ProcessMessages;
    ReadFile(f1, content1, block, bytes, nil);
    Application.ProcessMessages;
    ReadFile(f2, content2, block, bytes, nil);
    Application.ProcessMessages;
    for j := 1 to block do
    if content1[j] <> content2[j] then
    result := 2;
    Application.ProcessMessages;
    end;
    Application.ProcessMessages;
    ReadFile(f1, content1, s1 mod block, bytes, nil);
    Application.ProcessMessages;
    ReadFile(f2, content2, s2 mod block, bytes, nil);
    Application.ProcessMessages;
    for j := 1 to s1 mod block do
    if content1[j] <> content2[j] then
    result := 2;
    inc(count);
    Application.ProcessMessages;
    end;
    closehandle(f1);
    closehandle(f2);
    end;
    Мне не нравится то, что Total Commander хоть и может сравнивать большие файлы по содержимому, но делает он это долго. Поэтому я и решил написать свою программу, но есть некоторые сомнения в правильности её работы...
     
Загрузка...

Поделиться этой страницей