100分FileExists问题.十万火急

时间:2021-04-01 14:34:46
我在用FileExists判断本地一个中文文件名时总是返回false,问题出在什么地方。
源码如下,新建的一个测试工程,只有一个buttn
  var str: string;
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  if FileExists(str) then
  ShowMessage('ddd');

26 个解决方案

#1


检查一下ExtractFilePath(Application.ExeName) 后有没有‘\'。
你可以自己判断一下,没有'\'则加上。
还不行就可能确实没有那个文件了,你把str显示出来看看

#2


即使文件存在也得False,就是缺那个"\"

#3


我学才把你的代码调试过了,没出什么异常:
var
  str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  if FileExists(str) then
    ShowMessage(str)
  else
    ShowMessage('Not Exists');
end;

#4


我再次把这个生成的exe文件copy到win98、win2000、winXp的虚拟系统上进行调试。
一切运行正常。

#5


var str: string;
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
        //上面的函数返回的路径是带'/'的
  showMessage(str);  //看看路径是不是你要的再说
  if FileExists(str) then
  ShowMessage('ddd');

#6


look

#7


不会把 
var str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  //其中str的值如下
  str:= 'C:\Documents and Settings\Administrator\My Documents\最近设计模板.dat';
  if FileExists(str) then ShowMessage('ddd');
end;
文件最近设计模板.dat肯定存在的但是没有显示ShowMessage
郁闷ing

#8


你这个方法是否在类里面,而且该类有一个名为FileExists的子方法? 把上面的
if FileExists(str) then ShowMessage('ddd');
改成
if SysUtils.FileExists(str) then ShowMessage('ddd');
如果不行,确定你的"最近设计模板.dat"没被其它程序独占打开.

这是FileExists的源码:

function FileAge(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result := -1;
end;

function FileExists(const FileName: string): Boolean;
begin
  Result := FileAge(FileName) <> -1;
end;

其实你可以自己改改的,自己做个FileExists更好,不用Delphi判断时间的这个,给人感觉效率不高.

#9


其实,FileAge函数有个很明显的bug,那就是,如果执行到
if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
的话,函数体结束,但Result未初始化!可以是任意值~!

#10


你的代码没错,
ExtractFilePath(Application.ExeName)本身就是带“\”的,
肯定是你的输入的文件路径不对。
要不你设置资源管理器“显示完全路径”(文件选项中),然后从路径栏拷贝路径到你PAS文件中试试看。

要不你做下测试:
var str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  ShowMesage(str);
  if FileExists(str) then ShowMessage('ddd');
end;

#11


你的应用程序没放在
C:\Documents and Settings\Administrator\My Documents\
目录下吧。

#12


要不将“C:\Documents and Settings\Administrator\My Documents\”
改为
“C:\Docume~1\Administrator\MyDocu~1\”试一下

#13


先把路径SHOW出来看下对不对啊.

#14


关注

#15


这根我应用程序放在那个目录没关系,我用的是绝对路径也不行,你们做的都可以?我的开发环境是win2000 server delphi 6 delphi 7我都是过了不行。代码十分简单,新建的工程,就一个判断一个showmessage。TForm类中也没有FileExists方法。郁闷呀

#16


首先你要判断,ExtractFilePath(Application.ExeName)
最后一个字是否是"/"如果是则不用加,如果不是则要要加上

#17


ExtractFilePath(Application.ExeName)是带'\'的

#18


倒 怎么解决这个问题呀,我是过了好多函数,英文名称的文件名都可以,中文文件名就不行。help help

#19


可能是对中文文件的支持问题,要不改成拼音缩写

#20


delphi代码中最好都用英文...

#21


var str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  ShowMesage(str);//看看这里正确吗?
  if FileExists(str) then ShowMessage('ddd');
end;

你先Message出来看看正确吗?在根据问题分析。

#22


我也常用中文路径名,没遇到过这种情况,你的路径全名是什么,让我也试一下

#23


'D:\Documents and Settings\Administrator\My Documents\新建文件夹\最近设计模板.dcu' 文件名路径都是对的,主要是我必须用中文名,设计有点问题不想改,改动太大

#24


中文能有什么问题?
if FileExists('C:\Documents and Settings\Administrator\My Documents\新建文件夹\没有丑陋的女人只有贫穷的女人.JPG') then
    Showmessage('1');

我试了的,都没错啊。你换台机器试试看

#25


楼主另新建一个工程试试,如果还是这样的话,就重装..,重装..

#26


很是对不起大家,小弟我那天喝多了,其实太简单了,我的文件名用了.dat.dat两个扩展名。很是抱歉,可惜能给的人数太少,就一百,如果给分数少了,联系我qq8528630,msn:xun_love@hotmail.com,msn比较常用。很是抱歉,哎............

#1


检查一下ExtractFilePath(Application.ExeName) 后有没有‘\'。
你可以自己判断一下,没有'\'则加上。
还不行就可能确实没有那个文件了,你把str显示出来看看

#2


即使文件存在也得False,就是缺那个"\"

#3


我学才把你的代码调试过了,没出什么异常:
var
  str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  if FileExists(str) then
    ShowMessage(str)
  else
    ShowMessage('Not Exists');
end;

#4


我再次把这个生成的exe文件copy到win98、win2000、winXp的虚拟系统上进行调试。
一切运行正常。

#5


var str: string;
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
        //上面的函数返回的路径是带'/'的
  showMessage(str);  //看看路径是不是你要的再说
  if FileExists(str) then
  ShowMessage('ddd');

#6


look

#7


不会把 
var str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  //其中str的值如下
  str:= 'C:\Documents and Settings\Administrator\My Documents\最近设计模板.dat';
  if FileExists(str) then ShowMessage('ddd');
end;
文件最近设计模板.dat肯定存在的但是没有显示ShowMessage
郁闷ing

#8


你这个方法是否在类里面,而且该类有一个名为FileExists的子方法? 把上面的
if FileExists(str) then ShowMessage('ddd');
改成
if SysUtils.FileExists(str) then ShowMessage('ddd');
如果不行,确定你的"最近设计模板.dat"没被其它程序独占打开.

这是FileExists的源码:

function FileAge(const FileName: string): Integer;
var
  Handle: THandle;
  FindData: TWin32FindData;
  LocalFileTime: TFileTime;
begin
  Handle := FindFirstFile(PChar(FileName), FindData);
  if Handle <> INVALID_HANDLE_VALUE then
  begin
    Windows.FindClose(Handle);
    if (FindData.dwFileAttributes and FILE_ATTRIBUTE_DIRECTORY) = 0 then
    begin
      FileTimeToLocalFileTime(FindData.ftLastWriteTime, LocalFileTime);
      if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
    end;
  end;
  Result := -1;
end;

function FileExists(const FileName: string): Boolean;
begin
  Result := FileAge(FileName) <> -1;
end;

其实你可以自己改改的,自己做个FileExists更好,不用Delphi判断时间的这个,给人感觉效率不高.

#9


其实,FileAge函数有个很明显的bug,那就是,如果执行到
if FileTimeToDosDateTime(LocalFileTime, LongRec(Result).Hi,
        LongRec(Result).Lo) then Exit;
的话,函数体结束,但Result未初始化!可以是任意值~!

#10


你的代码没错,
ExtractFilePath(Application.ExeName)本身就是带“\”的,
肯定是你的输入的文件路径不对。
要不你设置资源管理器“显示完全路径”(文件选项中),然后从路径栏拷贝路径到你PAS文件中试试看。

要不你做下测试:
var str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  ShowMesage(str);
  if FileExists(str) then ShowMessage('ddd');
end;

#11


你的应用程序没放在
C:\Documents and Settings\Administrator\My Documents\
目录下吧。

#12


要不将“C:\Documents and Settings\Administrator\My Documents\”
改为
“C:\Docume~1\Administrator\MyDocu~1\”试一下

#13


先把路径SHOW出来看下对不对啊.

#14


关注

#15


这根我应用程序放在那个目录没关系,我用的是绝对路径也不行,你们做的都可以?我的开发环境是win2000 server delphi 6 delphi 7我都是过了不行。代码十分简单,新建的工程,就一个判断一个showmessage。TForm类中也没有FileExists方法。郁闷呀

#16


首先你要判断,ExtractFilePath(Application.ExeName)
最后一个字是否是"/"如果是则不用加,如果不是则要要加上

#17


ExtractFilePath(Application.ExeName)是带'\'的

#18


倒 怎么解决这个问题呀,我是过了好多函数,英文名称的文件名都可以,中文文件名就不行。help help

#19


可能是对中文文件的支持问题,要不改成拼音缩写

#20


delphi代码中最好都用英文...

#21


var str: string;
begin
  str:= ExtractFilePath(Application.ExeName) + '最近设计模板.dat';
  ShowMesage(str);//看看这里正确吗?
  if FileExists(str) then ShowMessage('ddd');
end;

你先Message出来看看正确吗?在根据问题分析。

#22


我也常用中文路径名,没遇到过这种情况,你的路径全名是什么,让我也试一下

#23


'D:\Documents and Settings\Administrator\My Documents\新建文件夹\最近设计模板.dcu' 文件名路径都是对的,主要是我必须用中文名,设计有点问题不想改,改动太大

#24


中文能有什么问题?
if FileExists('C:\Documents and Settings\Administrator\My Documents\新建文件夹\没有丑陋的女人只有贫穷的女人.JPG') then
    Showmessage('1');

我试了的,都没错啊。你换台机器试试看

#25


楼主另新建一个工程试试,如果还是这样的话,就重装..,重装..

#26


很是对不起大家,小弟我那天喝多了,其实太简单了,我的文件名用了.dat.dat两个扩展名。很是抱歉,可惜能给的人数太少,就一百,如果给分数少了,联系我qq8528630,msn:xun_love@hotmail.com,msn比较常用。很是抱歉,哎............