Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/delphi/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Delphi 5中打开带空格的文件路径_Delphi - Fatal编程技术网

在Delphi 5中打开带空格的文件路径

在Delphi 5中打开带空格的文件路径,delphi,Delphi,(使用Delphi5) 我正在尝试使用以下代码打开日志文件: // 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(fileNa

(使用Delphi5)

我正在尝试使用以下代码打开日志文件:

// 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路径?

我很确定Delphi 5可以处理文件名中的空间,但我已经很久没有使用该特定版本了。文件当前是否由其他进程打开?这也可能是权限问题。您可以尝试使用文件模式设置为“fmOpenRead或fmsharedynone”的tFileStream打开它,而不是将其加载到tStringList中吗

然后从流中加载tStringlist:

Logs.LoadFromStream ( fStm );

我很确定Delphi一直在处理空格,所以我怀疑这是个问题

您没有显示完整路径。有可能真的很长吗?例如,我可以相信路径长度超过255个字符的问题


把日志文件放在程序文件下也是个坏主意。通常,普通用户没有权限写入程序文件下的任何内容。

Delphi 5可以打开带有空格的文件,这当然不是问题所在。为了证明这一点,请尝试将其复制到c:\my log.log-它应该可以正常打开

您收到的错误消息中还有其他信息吗?最有可能的情况是,其他人(可能是您自己的程序)仍在向日志写入数据。

您确定不是“.\”导致问题,而不是空格。你有没有试过看看它是否能用

c:\My\Path\nospaces\

如果是这样,并且您总是使用..\path,那么可以编写一个简单的函数,从应用程序路径中删除最后一个文件夹,并创建一个完全正确的路径名。

奇怪的是,Delphi 5会在这方面抛出错误。我知道FileExists在最后修改日期无效的文件上出现故障(因为它在内部使用FileAge),但这里的情况正好相反。而不是使用“…”,我会冒着当前路径的风险,从相对路径加载:<代码> LoadFromFile('..某物\log。)code>特别是对于较小的应用程序,或者通过调用ExtractFilePath两次:
ExtractFilePath(ExtractFilePath(Application.ExeName))

空格不是问题。虽然Delphi5中的
“…”
可能是个问题,但大多数情况下,文件可能被写入文件的进程锁定。如果您可以控制它,请确保它使用
fmsharedeywrite
打开文件,而不是
fmsharedexclusive
fmsharedcompat
(默认设置)

此外,您还可以使用:

fileName := ExpandFileName(ExtractFilePath(Application.ExeName) + '..\Blah\logs\mylog.log');
从相对路径获取绝对路径

另外,正如其他人所说,在程序文件中编写任何内容都不是一个好主意。普通用户(不是管理员或超级用户)没有在那里写东西的权限(尽管在Vista中is将被虚拟化,但这仍然不是一个好主意)。为用户(或所有用户)使用适当的应用程序数据文件夹。可通过以下方式获取此文件夹:

SHGetFolderPath(0,folder,0,SHGFP_TYPE_CURRENT,@path[0])
其中,
folder
CSIDL\u COMMON\u APPDATA
CSIDL\u LOCAL\u APPDATA
。有关示例,请参见。

简单:


// 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';
问候,


Olivier

Delphi 5在打开文件时从未遇到过使用空格的问题,我仍在使用它,因为它非常稳定,适用于较旧的XP应用程序。您需要仔细检查代码。

不幸的是,我正在修改一个旧应用程序,没有选择:)实际路径与我解释中的路径一样长,因此我怀疑它是否是255个字符的限制。我这样做也是出于同样的原因。只要应用程序不是以受限用户的身份运行,它可能就可以了。我尝试了你的建议,收到了一个更隐晦的错误,这让我相信它与文件有关,而与代码无关。错误E/S 32我之前应该说过,我试图打开的文件是Apache访问日志,它位于Windows计算机上。如果我停止Apache服务,一切正常。显然Apache对文件有某种锁定(这是有充分理由的)。这次我严重误诊了这个问题:)。再次感谢您的帮助您可能正在尝试使用写访问权限打开。如果指定以只读方式打开日志文件,则可以将其打开。正在写入日志文件的进程可能会锁定该日志文件。这可以解释很多。这肯定会解释为什么我可以在移动它的位置时打开它。我尝试了相对路径,但它也有同样的问题,这让我确信它不是空格。而且仍然FileExists返回true,LoadFromFile失败?听起来文件被另一个进程锁定了。我暂时不得不避开这个问题,但如果有机会,我会检查错误是否是由实际写入日志的进程引起的。谢谢大家迄今为止的帮助。您确定写入文件的进程没有锁定该文件吗?

fileName := IncludeTrailingPathDelimiter(ExtractFilePath(Application.ExeName))
  + '..\Blah\logs\mylog.log';