我有一个例程,可以将文件转换为不同的格式并保存。原始数据文件已编号,但我的例程根据原始文件中的内部名称为输出提供文件名。
我试图在一个完整的目录上批量运行它,它工作正常,直到我点击一个内部名称中有斜杠的文件。哎呀!如果它在这里这样做,它可以很容易地在其他文件上。是否存在RTL(或WinAPI)例程,它将清理字符串并删除无效符号,以便可以安全地用作文件名?
解决方法
您可以使用
PathGetCharType function,PathCleanupSpec function或以下技巧:
- function IsValidFilePath(const FileName: String): Boolean;
- var
- S: String;
- I: Integer;
- begin
- Result := False;
- S := FileName;
- repeat
- I := LastDelimiter('\/',S);
- MoveFile(nil,PChar(S));
- if (GetLastError = ERROR_ALREADY_EXISTS) or
- (
- (GetFileAttributes(PChar(Copy(S,I + 1,MaxInt))) = INVALID_FILE_ATTRIBUTES)
- and
- (GetLastError=ERROR_INVALID_NAME)
- ) then
- Exit;
- if I>0 then
- S := Copy(S,1,I-1);
- until I = 0;
- Result := True;
- end;
此代码将字符串分成几部分,并使用MoveFile验证每个部分。 MoveFile将因无效字符或保留文件名(如“COM”)而失败,并返回成功或ERROR_ALREADY_EXISTS作为有效文件名。
PathCleanupSpec位于Win32API / JwaShlObj.pas下的Jedi Windows API中