Имя: Пароль:
IT
 
CreateFile создает mapped-file, даже если его не просишь.
0 H A D G E H O G s
 
10.11.21
13:11
Дня доброго.
Сегодня темка будет вне 1С, но да вдруг какой-нибудь Кирпич мне на голову свалится.

Есть достаточно простой код, который создает гиговый файл со случайными байтами.

function _GetErrorMsg(ecode: Cardinal): string;
var
  Buf: array [0 .. 1024] of char;
begin
  SetString(Result, Buf, FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, nil, ecode, 0, @Buf, sizeOf(Buf), nil));
  Result := StringReplace(Result, #13#10, '', [rfReplaceAll]);
end;

procedure TForm1.Button2Click(Sender: TObject);
var
  filename: String;
  hfile: THandle;
  buffer: TBytes;
  i: integer;
  blocksize: integer;
  bytesWritten: Cardinal;
  res: Boolean;
begin
  filename := 'D:\PR\de\data.txt';
  hfile := CreateFile(pchar(filename), GENERIC_WRITE, 0, nil, CREATE_ALWAYS, FILE_FLAG_WRITE_THROUGH, 0);
  if hfile = INVALID_HANDLE_VALUE then
  begin
    ShowMessage(_GetErrorMsg(GetLastError));
    exit;
  end;
  blocksize := 32000;
  Randomize;
  SetLength(buffer, blocksize);
  for i := 1 to blocksize do
  begin
    buffer[i - 1] := Random(100) + 100;
  end;
  for i := 1 to 40000 do
  begin
    res := WriteFile(hfile, buffer[0], blocksize, bytesWritten, nil);
    if res = false then
    begin
      ShowMessage(_GetErrorMsg(GetLastError));
      exit;
    end;
  end;
  FlushFileBuffers(hfile);
  CloseHandle(hfile);
end;

По результату у нас в папке будет 1.2 Гб файл:
https://prnt.sc/1z03cz7

И этот же файл, за каким то фигом будет маппирован в память:
https://prnt.sc/1z03gho

Хотя этого я точно у системы не просил (нет никаких CreateMappedFile)
Как его сбросить из mapped?
1 Asmody
 
10.11.21
13:13
это какой язык-то?
2 H A D G E H O G s
 
10.11.21
13:16
(1) WinAPI это
3 Asmody
 
10.11.21
13:22
(2) Я не большой специалист, но может вот это https://docs.microsoft.com/en-us/windows/win32/fileio/file-buffering ?
4 Asmody
 
10.11.21
13:24
ну, типа вот это: "File buffering is usually handled by the system behind the scenes and is considered part of file caching within the Windows operating system unless otherwise specified. "
5 H A D G E H O G s
 
10.11.21
13:26
(3) Вот не хотелось бы связываться с FILE_FLAG_NO_BUFFERING, потому что там особые требования к буферу и выделению памяти под него, но, если не будет ответа - попробую.
6 H A D G E H O G s
 
10.11.21
13:43
(3) Спасибо тебе, мудрый человек.
Сделал с комбинацией
FILE_FLAG_NO_BUFFERING or FILE_FLAG_WRITE_THROUGH и все взлетело.

Диск у меня с размером сектора в 512 байт, буфер будет кратен 512 (я взял 32768) и все у меня записалось.
Буфер выделял через getmem(), а не virtualalloc(), но ошибок не было, может там чето несогласованно записалось, но мне пофиг, мне нужен тупой большой файл на диске.
7 mistеr
 
10.11.21
13:54
(6) Мог бы просто взять dd для Win
8 mistеr
 
10.11.21
13:56
Мл еще проще fsutil file createnew
9 H A D G E H O G s
 
10.11.21
14:12
(8) (7) Мне нужно свое, контролируемое.
10 Asmody
 
10.11.21
14:20
(6) Университетский курс по операционным системам иногда наводит на верные мысли :)
11 Asmody
 
10.11.21
14:23
(7) не факт, что dd не делает буфер в памяти. Хотя, скорее всего, там есть какой-нибудь флаг
12 polosov
 
10.11.21
14:24
(10) Там достаточно описание параметров на MSDNе прочитать.
13 Asmody
 
10.11.21
14:28
(12) Да. Только бы ещё понять, что там написано :)
14 Casey1984
 
10.11.21
14:41
(1) Delphi
15 Asmody
 
10.11.21
14:53
(14) я бы не был так уверен. почему не FreePascal?
16 polosov
 
10.11.21
15:11
(15) Тащемта это Object Pascal, а какой компилятор используется - не важно.
Компьютер — устройство, разработанное для ускорения и автоматизации человеческих ошибок.