我有一个例程,可以将文件转换为不同的格式并保存。原始数据文件已编号,但我的例程根据原始文件中的内部名称为输出提供文件名。
我试图在一个完整的目录上批量运行它,它工作正常,直到我点击一个内部名称中有斜杠的文件。哎呀!如果它在这里这样做,它可以很容易地在其他文件上。是否存在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中