在论坛上混这么久,没做啥贡献,特整理献上一个判断文件名是否合法的完整函数.需要的请笑纳(0分)

  • 主题发起人 主题发起人 aKnightChen
  • 开始时间 开始时间
A

aKnightChen

Unregistered / Unconfirmed
GUEST, unregistred user!
function fIsValidFileName(sFileName:string):Boolean;
var
i:Integer;
const
S_RESERVE_FILE_NAME:array[0..21] of string=(
'CON',
'AUX',

'COM1',
'COM2',
'COM3',
'COM4',
'COM5',
'COM6',
'COM7',
'COM8',
'COM9',

'LPT1',
'LPT2',
'LPT3',
'LPT4',
'LPT5',
'LPT6',
'LPT7',
'LPT8',
'LPT9',

'PRN',
'NUL');
begin

{
文件名必须遵循操作系统约定。在 Microsoft Windows 中,可使用以下的约定:
1、文件或目录名称可以有两部分:文件名和任选性的扩展名。两部分以圆点隔开,例如,myfile.new。
2、文件名可达 255 字符。实际上(win2000测试)文件的最大长度为216(218删除时出错),目录为206
3、文件名必须以字母或数字开头。它可以包含大小写字符(文件名不分大小写),但以下的字符除外:双引号(")、撇号(') 、斜杠(/)、反斜杠(/)、冒号(:)、垂直条(|)。
4、文件名可以包含空格。
5、以下的名称将保留,且不能用在文件或目录上:CON、AUX、COM1、COM2、COM3、COM4、LPT1、LPT2、LPT3、PRN、NUL。也不能用使用以上名称+"."作为文件名的开头部分,如“CON.ABC.TXT”是不允许的。
}

Result:=False;
sFileName:=UpperCase(Trim(sFileName));

if sFileName='' then Exit;
if sFileName='.' then Exit;
if sFileName='..' then Exit;
if Length(sFileName)>200 then Exit;

for i:=Low(S_RESERVE_FILE_NAME) to High(S_RESERVE_FILE_NAME) do
begin
if sFileName=S_RESERVE_FILE_NAME then Exit;
if Copy(sFileName,1,Length(S_RESERVE_FILE_NAME+'.'))=S_RESERVE_FILE_NAME+'.' then Exit;
end;

for i:=1 to Length(sFileName) do
if sFileName in ['<','>','?','/','/',':','*','|','"'] then Exit;

Result:=True;
end;
 
A ----2、文件名可达 255 字符。实际上(win2000测试)文件的最大长度为216(218删除时出错),目录为206

B ----if Length(sFileName)>200 then Exit;

A跟B不矛盾么?
 
确实.不过,不敢确定204,203就能正确,所以干脆就200.
楼上严谨!
 
后退
顶部