2009-05-07 5 views
0

나는 다음과 같은 코드를 사용하여 로그 파일을 열려고 시도하고열기 파일 경로 5

(델파이 5 사용) : 나는 C 로그 파일 위치를 변경하는 경우

// 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; 

을 : \ mylog.log 코드가 완벽하게 작동합니다. 파일 경로의 공백이 엉망이라고 생각하고 있습니다. 누구든지 이것이 델파이 5의 정상적인 동작인지 알 수 있습니까? 그렇다면 공간을 벗어나 Windows 8.3 경로로 경로를 변환하는 함수가 있습니까?

+0

나는 잠시 동안 떨어져 문제에서 단계로 했어,하지만 난 기회를 얻을 때, 나는 오류가 실제로 로그에 쓰기 프로세스에 의해 발생되어 있는지 확인합니다. 지금까지 도움을 주셔서 감사합니다. – pifantastic

+0

파일을 쓰는 프로세스에 의해 파일이 잠겨 있지 않습니까? – Kcats

답변

3

필자는 Delphi 5가 파일 이름에서 공백을 처리한다고 확신하지만 특정 버전을 사용한 이후로 오랜 시간이 걸렸습니다. 파일이 현재 다른 프로세스에서 열려 있습니까? 또한 권한 문제 일 수 있습니다. tStringList에로드하는 대신, "fmOpenRead 또는 fmShareDenyNone"으로 설정된 파일 모드로 tFileStream으로 열어 볼 수 있습니까?

fStm := tFileStream.Create(filename, fmOpenRead or fmShareDenyNone); 

다음 스트림에서 TStringList를로드 :

Logs.LoadFromStream (fStm); 
+0

나는 당신의 제안을 시도하고, 그것이 코드가 아닌 파일과 관련이 있다고 믿게 만드는 훨씬 더 비밀스러운 오류를 받았다. – pifantastic

+0

어떤 오류가 발생 했습니까? – skamradt

+0

Error E/S 32 방금 ​​전에 말씀 드렸어야 할 것은 열려는 파일이 Apache 액세스 로그이고 Windows 컴퓨터에있는 것입니다. 아파치 서비스를 중단하면 모든 것이 잘 동작한다. 그래서 명백하게 아파치는 파일에 어떤 종류의 잠금 장치를 가지고있다. 나는이 문제를 심각하게 잘못 진단했다. :) 다시 도움에 감사드립니다. – pifantastic

1

는 내가 그 문제를 의심 있도록 델파이는 항상 공백을 처리했다 확신 해요.

전체 경로가 표시되지 않습니다. 어떤 경우에 그것은 정말로 길다. 예를 들어 경로 길이가 255 자보다 긴 문제가 있다고 생각할 수 있습니다.

로그 파일을 Program Files에 두는 것도 좋지 않습니다. 종종 일반 사용자에게는 Program Files 아래의 항목에 쓸 수있는 권한이 부여되지 않습니다.

+0

는 불행하게도 나는 이전 응용 프로그램을 수정하고있어 선택 : 나는 그것을 255 자 제한 의심 때문에 실제 경로는 내 설명에있는 한만큼 관한이 없습니다. – pifantastic

+0

나는 또한 같은 이유로 그것을했습니다. 응용 프로그램이 제한된 사용자로 실행되지 않는 한 아마 괜찮을 것입니다. –

1

Delphi 5는 공백이있는 파일을 열 수 있습니다. 물론 문제는 아닙니다. 그것을 증명하려면 c : \ my log.log에 복사 해보십시오. 정상적으로 열어야합니다.

더 많은 정보가 나타 났습니까? 가장 가능성있는 일은 누군가 (아마도 자신의 프로그램)가 로그를 쓰고 있다는 것입니다.

+0

로그 파일은 기록중인 프로세스에 의해 잠길 수 있습니다. 그것은 많은 것을 설명 할 것입니다. 그것은 내가 위치를 옮길 때 왜 내가 그것을 열 수 있는지를 설명 할 것입니다. – pifantastic

2

공백이 아닌 ".."가 문제가 아닌지 확인하십시오. 당신이 그렇다면

c:\My\Path\nospaces\ 

에서 작동하는지 확인하기 위해 시도하고 당신은 항상 당신의 응용 프로그램 경로에서 마지막 폴더를 제거하고 전체 올바른 경로 이름을 만들 수 어쩌면 간단한 함수를 작성의 .. \ 경로를 사용하고 있습니다.

2

Delphi 5가이 문제를 던질 수 있다는 것이 이상합니다. FileExists가 마지막으로 변경된 날짜가 유효하지 않은 파일 (FileAge를 내부적으로 사용하고 있기 때문에)에 문제가 있음을 알고 있습니다 만, 그 반대입니다. ".. \"을 사용하는 대신 현재 경로의 위험을 감수하고 상대 경로에서로드하는 것이 좋습니다. 특히 작은 응용 프로그램의 경우 또는 ExtractFilePath를 두 번 호출하면 ExtractFilePath(ExtractFilePath(Application.ExeName))

+0

나는 상대 경로를 시도했는데 똑같은 문제가있어서 공간이 아니라고 확실히 믿는다. – pifantastic

+0

여전히 FileExists가 true를 반환하고 LoadFromFile이 실패합니까? 파일이 다른 프로세스에 의해 잠긴 것처럼 들립니다. –

0

Vista에서 응용 프로그램을 실행할 때 권한 문제가 있음

1

공백은 문제가되지 않습니다. '..'은 Delphi 5에서 문제가 될 수 있지만 mosts 파일은 아마도이 파일에 쓰는 프로세스에 의해 잠겨있을 것입니다. 제어가 가능한 경우 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]) 

folderCSIDL_COMMON_APPDATA 또는 CSIDL_LOCAL_APPDATA 중입니다. 예를 들어 this delphi.about.com article을 참조하십시오.

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'; 

감사를

올리비에

0

델파이 5가 공백이있는 파일을 여는 데 문제가 없었으며 안정적이고 안정적인 작업이므로 여전히 사용하고 있습니다. 에서 구형 XP 용. 코드를 자세히 확인해야합니다.