Rev 6 | 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); |
||
6 | daniel-mar | 12 | procedure MyRewrite(hFile: THandle); |
13 | procedure MyWriteLn(hFile: THandle; s: AnsiString); |
||
2 | daniel-mar | 14 | procedure MyReadLn(hFile: THandle; var s: string); |
15 | procedure MyCloseFile(hFile: THandle); |
||
16 | function MyEOF(hFile: THandle): boolean; |
||
17 | procedure MyBlockRead(var hFile: THandle; var Buffer; RecordCount: integer; var RecordsRead: integer); |
||
18 | |||
19 | implementation |
||
20 | |||
21 | uses |
||
22 | Windows, SysUtils; |
||
23 | |||
24 | procedure MyAssignFile(var hFile: THandle; filename: string); |
||
17 | daniel-mar | 25 | var |
26 | lastErr: DWORD; |
||
2 | daniel-mar | 27 | begin |
17 | daniel-mar | 28 | if Copy(filename, 2, 1) = ':' then filename := '\\?\' + filename; // To allow long filenames |
6 | daniel-mar | 29 | hFile := CreateFile(PChar(filename), GENERIC_READ or GENERIC_WRITE, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0); |
30 | if hFile = INVALID_HANDLE_VALUE then |
||
31 | begin |
||
17 | daniel-mar | 32 | lastErr := GetLastError; |
33 | if lastErr = ERROR_ACCESS_DENIED then |
||
6 | daniel-mar | 34 | begin |
35 | hFile := CreateFile(PChar(filename), GENERIC_READ, FILE_SHARE_READ or FILE_SHARE_WRITE, nil, OPEN_EXISTING, FILE_ATTRIBUTE_READONLY, 0); |
||
36 | if hFile = INVALID_HANDLE_VALUE then RaiseLastOSError; |
||
37 | end |
||
17 | daniel-mar | 38 | else RaiseLastOSError(lastErr); |
6 | daniel-mar | 39 | end; |
2 | daniel-mar | 40 | end; |
41 | |||
42 | procedure MyReset(hFile: THandle); |
||
43 | begin |
||
44 | SetFilePointer(hFile, 0, nil, FILE_BEGIN); |
||
45 | end; |
||
46 | |||
6 | daniel-mar | 47 | procedure MyRewrite(hFile: THandle); |
48 | begin |
||
49 | SetFilePointer(hFile, 0, nil, FILE_BEGIN); |
||
50 | SetEndOfFile(hFile); |
||
51 | end; |
||
52 | |||
53 | procedure MyWriteLn(hFile: THandle; s: AnsiString); |
||
54 | var |
||
55 | numWritten: Cardinal; |
||
56 | begin |
||
57 | s := s + #13#10; |
||
58 | WriteFile(hFile, s[1], Length(s), numWritten, nil); |
||
59 | if Cardinal(Length(s)) <> numWritten then RaiseLastOSError; |
||
60 | end; |
||
61 | |||
2 | daniel-mar | 62 | procedure MyReadLn(hFile: THandle; var s: string); |
63 | var |
||
64 | buf: array [0..0] of ansichar; |
||
65 | dwread: LongWord; |
||
66 | begin |
||
67 | s := ''; |
||
68 | ReadFile(hFile, buf, 1, dwread, nil); |
||
69 | while (dwread > 0) do |
||
70 | begin |
||
3 | daniel-mar | 71 | 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 | 72 | begin |
3 | daniel-mar | 73 | if buf[0] = #10 then exit; |
2 | daniel-mar | 74 | s := s + string(buf[0]); |
75 | end; |
||
76 | Readfile(hFile, buf, 1, dwread, nil); |
||
77 | end; |
||
78 | end; |
||
79 | |||
80 | procedure MyCloseFile(hFile: THandle); |
||
81 | begin |
||
82 | CloseHandle(hFile); |
||
83 | end; |
||
84 | |||
85 | function MyEOF(hFile: THandle): boolean; |
||
86 | var |
||
87 | buf: array [0..0] of ansichar; |
||
88 | dwread: LongWord; |
||
89 | begin |
||
90 | Readfile(hFile, buf, 1, dwread, nil); |
||
91 | if dwread > 0 then |
||
92 | begin |
||
93 | SetFilePointer(hFile, -dwread, nil, FILE_CURRENT); |
||
94 | result := false; |
||
95 | end |
||
96 | else |
||
97 | begin |
||
98 | result := true; |
||
99 | end; |
||
100 | end; |
||
101 | |||
102 | procedure MyBlockRead(var hFile: THandle; var Buffer; RecordCount: integer; var RecordsRead: integer); |
||
103 | var |
||
104 | RecordCount2, RecordsRead2: Cardinal; |
||
105 | begin |
||
106 | RecordCount2 := RecordCount; |
||
107 | RecordsRead2 := RecordsRead; |
||
108 | ReadFile(hFile, Buffer, RecordCount2, RecordsRead2, nil); |
||
109 | //RecordCount := RecordCount2; |
||
110 | RecordsRead := RecordsRead2; |
||
111 | end; |
||
112 | |||
113 | end. |