|
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, а какой компилятор используется - не важно.
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |