我用Delphi 7编写程序。我只需要在非Unicode文件名上工作即可。如果找到Unicode文件名,则应忽略它。
我的代码如下所示:
var Filename: String;
if not FileExists(Filename) then Exit;
F := TFileStream(Filename, fmOpenRead or fmShareDenyWrite);
Run Code Online (Sandbox Code Playgroud)
但是,在某些Unicode文件名的情况下,FileExists()返回true,但随后TFileStream引发异常,因为路径无效。
例如:将名为“ loop ??。jpg”的文件读为“ loop ??。jpg”。这是预期的行为。TFileStream无法读取此类文件(因为目录中没有“ loop ??。jpg”)并引发异常。但是FileExists()应该知道该文件不存在。为什么不起作用?因为它定义为:
function FileExists(const FileName: string): Boolean;
begin
Result := FileAge(FileName) <> -1;
end;
Run Code Online (Sandbox Code Playgroud)
FileAge()定义为:
function FileAge(const FileName: string): Integer;
var
Handle: THandle;
FindData: TWin32FindData;
LocalFileTime: TFileTime;
begin
Handle := FindFirstFile(PChar(FileName), FindData);
...
Run Code Online (Sandbox Code Playgroud)
FindFirstFile使用“ loop .jpg”作为掩码,然后查找“ loop .jpg”。
所以问题很重要:
1)我可以在Delphi 7中以某种方式轻松地在TFileStream中使用Unicode文件名吗?
要么
2)应该使用什么功能代替FileExists以获得正确的结果?
Rem*_*eau 11
不TFileStream,不。但是您可以改用Win32 CreateFileW()打开Unicode文件名,然后将返回值分配HANDLE给THandleStream。这实质上是TFileStream内部操作(CreateFileA()在Delphi 7中使用)。
更高版本的Delphi 在实现时使用Win32 1而不是RTL 。 不像那样支持通配符。GetFileAttributes() FileAge()FileExists()GetFileAttributes()FindFirstFile()
或者,您根本无法在打开文件之前根本不检查文件是否存在,只是无条件打开它并捕获所产生的错误。操作系统会告诉您失败是由于找不到文件还是其他错误引起的。
| 归档时间: |
|
| 查看次数: |
221 次 |
| 最近记录: |