점점 더 많은 사용자가 내 응용 프로그램을 설치하거나 시작할 수 없다는 불만이 늘어나고 있습니다.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
는 모든 것을 요약합니다. 문제는 실제로 로컬 사용자 경로가 추출 된 방식이었습니다. 이 특정 사용자의 경우 레지스트리 키는 아무런 가치가 없습니다. 따라서 데이터는 프로그램 파일 아래에있는 설치 디렉토리에 복사되었습니다 ...
짧은 설명 : 응용 프로그램 데이터에는 사용자에게 권한이없는 읽기/쓰기 권한이 필요하므로 오류가 발생했습니다. 모든 답변에 다시 한번 감사 드리며 올바른 방향으로 안내합니다.
이 레지스트리 키를 열 때 아래의 첫 번째 항목 (표준)에 "이 레지스트리 키를 사용하지 마십시오."대신 "SHGetFolderPath 또는 SHGetKnownFolderPath 함수를 사용하십시오"라는 메시지가 나타납니다. –
그건 찾는 방법이 아닙니다. 특별한 폴더 위치. API 함수를 사용하십시오. –
고마워, 나는 항상 새로운 것을 배울 수있어서 행복하다. 알다시피, 이것은 최고 수준의 레거시 코드이며 파이썬 녀석입니다. – rocksteady