2016-06-07 5 views
-2

점점 더 많은 사용자가 내 응용 프로그램을 설치하거나 시작할 수 없다는 불만이 늘어나고 있습니다.System.SYSUTILS.ForceDirectories를 사용하여 폴더를 만들 수 없음

디렉토리 구조가 처음부터 존재하지 않는 4 디렉토리로 구성된 내장되어 System.SYSUTILS.ForceDirectories(...) 사용 :

는 문제가 무엇입니까. 이것은 응용 프로그램이 처음 시작할 때 발생합니다. 일부 컴퓨터에서는 ForceDirectories() returns False이므로 불가능한 것 같습니다.

if (not TDirectory.Exists(self.TempInstallPath)) then 
begin 
    if (System.SYSUTILS.ForceDirectories(self.TempInstallPath)) then 
     begin 
     uGlobalFiles.DeleteDirectoryContents(self.TempInstallPath, self.GetLoggingFunc()); 
     if (not self.copyDatabase(source)) then 
      raise TCopyDatabase_Exception.Create('Database could not be copied to: ' + sLineBreak + self.TempInstallPath); 
     end 
     else 
     begin 
     raise TPathCouldNotBeCreated_Exception.Create('adding a new directory failed with error: ' + sLineBreak + SysErrorMessage(GetLastError) 
       + sLineBreak 
       + 'destination folder: ' + self.TempInstallPath 
       + sLineBreak 
       + 'local user folder:' + self.LocaluserPath 
       + sLineBreak 
       + 'session time stamp:' + self.TimeStamp); 
     end; 
end; 

경로가 사용됩니다 :

나는 경로와 정보를 생성 결정 이유를 들어

오류가 발생한 정확한 위치를 내가 알고 (다음 그냥 코드입니다) 사용자의 로컬 AppData 폴더에 있습니다. 내가 레지스트리에서 값을 가져 :이 는 지금까지 내가 정확한 오류를 재현 할 수 없습니다 : 내가 지금까지 무슨 짓을

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders 

. 사용자의 소유권을 가져 가려고했지만 다른 오류가 표시됩니다. 또한 그 디렉토리에서 특별한 사용 권한을 가지고 어지럽히는 것 - "폴더 생성"을 거부하는 것 등 - 아무 소용이 없습니다.

내가 누락되었거나 그러한 경우에 할 수있는 것이 있습니까?

도움 주시면 감사하겠습니다. 나는 오류 메시지를 알고,

function GetShellFolder(CSIDLFolder : integer) : string; 
begin 
SetLength(Result, MAX_PATH); 
    SHGetSpecialFolderPath(0, PChar(Result), CSIDLFolder, false); // (CSIDL_LOCAL_APPDATA -- FOLDERID_LocalAppData) 
    SetLength(Result, StrLen(PChar(Result))); 
    if (Result <> '') then 
    Result := IncludeTrailingBackslash(Result); 
end; 

UPDATE2 이미 SysErrorMessage (GetLastError)를 사용하기 때문에

:

갱신 1

는 지금은 로컬 사용자 폴더가이 일을 얻을 문자 그대로 오류가 없다고 말합니다. 또한 (고객으로부터) 생성 할 4 개의 폴더 중 첫 번째 폴더가 숨겨진 폴더로 만들어졌고 다른 폴더는 전혀 만들어지지 않았다는 것을 알고 있습니다. 하지만 컨텍스트 메뉴를 사용하여 폴더를 만들 수 있습니다.

갱신 3

오류를 해결 갱신 1에 언급 된 변화. 아무것도 레지스트리에 저장되지 이후 :

HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders 

프로그램은 C에 직접 작성하는 시도 : 일부 사용자가 쓸 수있는 권한이 없습니다 \ 프로그램 파일 (실행 파일의 경로).

나는 Andre Ruebel의 해답을 받아 들였지만, 논평 한 모든 사람들이 나에게이 문제에 관해 뭔가를 가르쳐 주었다. 모두에게 감사드립니다.

UPDATE4

는 모든 것을 요약합니다. 문제는 실제로 로컬 사용자 경로가 추출 된 방식이었습니다. 이 특정 사용자의 경우 레지스트리 키는 아무런 가치가 없습니다. 따라서 데이터는 프로그램 파일 아래에있는 설치 디렉토리에 복사되었습니다 ...

짧은 설명 : 응용 프로그램 데이터에는 사용자에게 권한이없는 읽기/쓰기 권한이 필요하므로 오류가 발생했습니다. 모든 답변에 다시 한번 감사 드리며 올바른 방향으로 안내합니다.

+1

이 레지스트리 키를 열 때 아래의 첫 번째 항목 (표준)에 "이 레지스트리 키를 사용하지 마십시오."대신 "SHGetFolderPath 또는 SHGetKnownFolderPath 함수를 사용하십시오"라는 메시지가 나타납니다. –

+2

그건 찾는 방법이 아닙니다. 특별한 폴더 위치. API 함수를 사용하십시오. –

+0

고마워, 나는 항상 새로운 것을 배울 수있어서 행복하다. 알다시피, 이것은 최고 수준의 레거시 코드이며 파이썬 녀석입니다. – rocksteady

답변

3

사용

var 
    P: array [0 .. max_path] of Char; 
begin 
    SHGetFolderPath(0, CSIDL_APPDATA, 0, 0, @P[0]); 
end; 

는 APPDATA 디렉토리를 얻을 수 있습니다. forcedirectories 기능이 실패 할 경우 의미있는 오류 메시지를 얻을 수

SysErrorMessage(getlasterror) 

를 사용합니다.

+0

FWIW,'SHGetFolferPath (0, CSIDL_APPDATA, 0, 0, P)'도 아마 작동 할 것입니다. –

+0

나는 이미 SysErrorMessage (getlasterror)를 수행한다. 코드 스 니펫에서 오른쪽으로 스크롤하면된다. – rocksteady

+0

아주 잘 설명하는 [this] (http://stackoverflow.com/questions/12771473/finding-a-windows-users-true-application-data-folder)을 발견했습니다. – rocksteady