Функция Createfile

  • Автор темы Vadik(R)
  • Дата начала
V

Vadik(R)

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

vital

Это читали?
 
V

Vadik(R)

Последний вопрос хотел задать по теме WinAPI функций работы с файлами.
Я бы и не заморачивался с ними работать, но меня расстроила неправильная работа функции filesize для файлов больше 4 Гб.
Узнал про функцию getfilesize. Узнал также, что чтобы правильно работала функция getfilesize для больших файлов, надо открывать файл с помощью CreateFile.
В общем, размер больших файлов определяется правильно, проверял на 6 Гб образах игр и сравнивал с известным значением благодаря винде =)
Вот, теперь последнее, что беспокоит, правильно ли работает функция ReadFile для больших файлов. То есть точно она их считывает до конца? Или может тут тоже свои нюансы есть. Вот, в общем, мой код, где я читаю файл от начала до конца. Хотел узнать, действительно ли файл считывается полностью и до конца в результате выполнения кода:
Код:
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 хоть и может сравнивать большие файлы по содержимому, но делает он это долго. Поэтому я и решил написать свою программу, но есть некоторые сомнения в правильности её работы...
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!