Rev 2 | Rev 6 | Go to most recent revision | Details | Compare with Previous | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
2 | daniel-mar | 1 | unit LongFilenameOperations; |
2 | |||
3 | interface |
||
4 | |||
5 | // These procedures should replace the Delphi internal AssignFile(), Reset(), etc. |
||
6 | // functions. These functions should be able to support long file names |
||
7 | // by using the WinAPI (the "long filename" mode is switched when the file |
||
8 | // name format \\?\ is used). |
||
9 | |||
10 | procedure MyAssignFile(var hFile: THandle; filename: string); |
||
11 | procedure MyReset(hFile: THandle); |
||
12 | procedure MyReadLn(hFile: THandle; var s: string); |
||
13 | procedure MyCloseFile(hFile: THandle); |
||
14 | function MyEOF(hFile: THandle): boolean; |
||
15 | procedure MyBlockRead(var hFile: THandle; var Buffer; RecordCount: integer; var RecordsRead: integer); |
||
16 | |||
17 | implementation |
||
18 | |||
19 | uses |
||
20 | Windows, SysUtils; |
||
21 | |||
22 | procedure MyAssignFile(var hFile: THandle; filename: string); |
||
23 | begin |
||
24 | hFile := CreateFile(PChar(filename), GENERIC_READ, FILE_SHARE_READ, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0); |
||
25 | if hFile = INVALID_HANDLE_VALUE then RaiseLastOSError; |
||
26 | end; |
||
27 | |||
28 | procedure MyReset(hFile: THandle); |
||
29 | begin |
||
30 | SetFilePointer(hFile, 0, nil, FILE_BEGIN); |
||
31 | end; |
||
32 | |||
33 | procedure MyReadLn(hFile: THandle; var s: string); |
||
34 | var |
||
35 | buf: array [0..0] of ansichar; |
||
36 | dwread: LongWord; |
||
37 | begin |
||
38 | s := ''; |
||
39 | ReadFile(hFile, buf, 1, dwread, nil); |
||
40 | while (dwread > 0) do |
||
41 | begin |
||
3 | daniel-mar | 42 | if buf[0] <> #13 then // Note: The first line of SFV files contains a comment ended with LF while the other lines end with CR-LF |
2 | daniel-mar | 43 | begin |
3 | daniel-mar | 44 | if buf[0] = #10 then exit; |
2 | daniel-mar | 45 | s := s + string(buf[0]); |
46 | end; |
||
47 | Readfile(hFile, buf, 1, dwread, nil); |
||
48 | end; |
||
49 | end; |
||
50 | |||
51 | procedure MyCloseFile(hFile: THandle); |
||
52 | begin |
||
53 | CloseHandle(hFile); |
||
54 | end; |
||
55 | |||
56 | function MyEOF(hFile: THandle): boolean; |
||
57 | var |
||
58 | buf: array [0..0] of ansichar; |
||
59 | dwread: LongWord; |
||
60 | begin |
||
61 | Readfile(hFile, buf, 1, dwread, nil); |
||
62 | if dwread > 0 then |
||
63 | begin |
||
64 | SetFilePointer(hFile, -dwread, nil, FILE_CURRENT); |
||
65 | result := false; |
||
66 | end |
||
67 | else |
||
68 | begin |
||
69 | result := true; |
||
70 | end; |
||
71 | end; |
||
72 | |||
73 | procedure MyBlockRead(var hFile: THandle; var Buffer; RecordCount: integer; var RecordsRead: integer); |
||
74 | var |
||
75 | RecordCount2, RecordsRead2: Cardinal; |
||
76 | begin |
||
77 | RecordCount2 := RecordCount; |
||
78 | RecordsRead2 := RecordsRead; |
||
79 | ReadFile(hFile, Buffer, RecordCount2, RecordsRead2, nil); |
||
80 | //RecordCount := RecordCount2; |
||
81 | RecordsRead := RecordsRead2; |
||
82 | end; |
||
83 | |||
84 | end. |