(使用Delphi 5)
我正在尝试使用以下代码打开日志文件:
// The result of this is:
// C:\Program Files\MyProgram\whatever\..\Blah\logs\mylog.log
fileName := ExtractFilePath(Application.ExeName) + '..\Blah\logs\mylog.log';
// The file exists check passes
if (FileExists(fileName)) then
begin
logs := TStringList.Create();
// An exception is thrown here: 'unable to open file'
logs.LoadFromFile(fileName);
end;
如果我将日志文件重定位到C:\ mylog.log,则代码可以正常运行。我在想文件路径中的空格是搞乱的。有谁知道这是否是Delphi 5的正常行为?如果是,是否有一个函数来逃避空间或将路径转换为Windows 8.3路径?
答案 0 :(得分:3)
我很确定Delphi 5可以处理文件名中的空格,但是自从我使用该特定版本以来已经很长时间了。该文件当前是否由另一个进程打开?它也可能是权限问题。您是否可以将其加载到tStringList中,尝试使用tFileStream打开它,并将filemode设置为“fmOpenRead或fmShareDenyNone”。
fStm := tFileStream.Create( filename, fmOpenRead or fmShareDenyNone );
然后从流中加载你的tStringlist:
Logs.LoadFromStream ( fStm );
答案 1 :(得分:2)
你确定它不是导致问题的“.. \”而不是空格。你有没有试过看看它是否适用于
c:\My\Path\nospaces\
如果是这样,并且您总是使用.. \路径,可以编写一个简单的函数来从应用程序路径中删除最后一个文件夹并创建一个完整正确的路径名。
答案 2 :(得分:2)
奇怪的是Delphi 5会抛出这个错误。我知道FileExists在上一个修改日期无效的文件上失败的问题(因为它在内部使用FileAge),但这是相反的。而不是使用“.. \”我会考虑冒险冒险当前路径,并从相对路径加载:LoadFromFile('..\Something\Something.log');
,特别是对于较小的应用程序,或通过两次调用ExtractFilePath:ExtractFilePath(ExtractFilePath(Application.ExeName))
答案 3 :(得分:1)
我很确定Delphi总是处理空间,所以我怀疑这是问题。
您没有显示完整路径。它真的很长吗?例如,我可以相信路径超过255个字符的问题。
将日志文件放在Program Files下也是一个坏主意。通常,普通用户无权在Program Files下写入任何内容。
答案 4 :(得分:1)
Delphi 5可以打开带空格的文件 - 这当然不是问题。要证明这一点,请尝试将其复制到c:\ my log.log-它应该打开。
您收到的错误消息中是否还有其他信息?最有可能的是,其他人(可能是您自己的程序)仍在将写入日志。
答案 5 :(得分:1)
空间不是问题。虽然'..'
可能是Delphi 5中的一个问题,但大多数情况下该文件可能会被写入它的进程锁定。如果您可以控制它,请确保它使用fmShareDenyWrite
而不是fmShareExclusive
或fmShareCompat
(这是默认设置)打开文件。
另外,您可以使用:
fileName := ExpandFileName(ExtractFilePath(Application.ExeName) + '..\Blah\logs\mylog.log');
从相对路径获取绝对路径。
此外,正如其他人所说,在Program Files中编写任何内容都不是一个好主意。普通用户(不是管理员或高级用户)没有权限在那里写(虽然在Vista中将被虚拟化,但仍然不是一个好主意)。为用户(或所有用户)使用适当的Application Data文件夹。可以使用以下方法获取此文件夹:
SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path[0])
其中folder
为CSIDL_COMMON_APPDATA
或CSIDL_LOCAL_APPDATA
。有关示例,请参阅this delphi.about.com article。
答案 6 :(得分:0)
当您在Vista上运行该应用时,您有权利问题
答案 7 :(得分:0)
简单:
// if log file = "C:\Program files\mylog.log"
// you'll get :
// »»»»» fileName = 'C:\Program files..\Blah\logs\mylog.log'
// if log file = "C:\mylog.log"
// you'll get :
// »»»»» fileName = 'C:..\Blah\logs\mylog.log'
请尝试使用此代码,我非常确定它符合您的需求:
fileName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName))
+ '..\Blah\logs\mylog.log';
此致
奥利弗
答案 8 :(得分:0)
Delphi 5从来没有打开带空格的文件的问题,我仍在使用它,因为它非常稳定,适用于较旧的XP应用程序。您需要仔细检查您的代码。