3

Ruby에서 CLI 응용 프로그램을 개발 중이며 표준 구성 파일 캐스케이드 /etc/appnamerc, ~/.appnamerc을 통해 유닉스에서 구성 할 수 있습니다. 그러나이 응용 프로그램은 Windows 환경에서 실행하기위한 것이므로 /etc/appnamerc (C:\windows\system32\etc\drivers)과 같은 파일을 어디에 둘 것인지 확실하지 않습니다. 올바른 위치가 아닌 것 같습니다. 또한 시스템 구성 파일을 조회하기 위해 어떤 계획을 세우더라도 다른 버전의 Windows를 고려해야합니다 (예 : C:\UsersC:\Documents and Settings). 사용자 별 구성이 진행되는 한, 사용자 별 구성 파일을 찾는 위치와 응용 프로그램의 표준 명명 규칙이 무엇인지 알 수 없습니다.Windows 시스템 구성 디렉토리와 같습니다.

답변

1

무엇 당신이 찾고있는 것은 SHGetKnownFolderPath function (윈도우의 또는-에 이전 버전 SHGetFolderPath function)입니다.

Windows는 이러한 경로와 위치를 규칙으로 가지고 있지만 버전, 구성 및 기타 요인에 따라 달라 지므로 하드 코딩 폴더 이름은 입니다. 아이디어입니다. 위의 기능은 처음부터이 "특별한"폴더 위치를 얻는 방법이었습니다.

이러한 함수의 주된 인수는 KNOWNFOLDERID 또는 CSIDL이며 가져올 폴더를 지정합니다.

실제로 두 가지 '플래그'가 있습니다. Windows에서의 사용자 별 및 컴퓨터 별. 위치는 단일 사용자에 특정되거나 모든 사용자가 사용할 수 있으며 단일 시스템에만 한정되거나 사용자가 액세스 할 수있는 모든 시스템에서 사용 가능할 수 있습니다. 그것들은 아래에서 구별 될 것입니다.

  • FOLDERID_ProgramData/CSIDL_COMMON_APPDATA : 당신이 여기 싶어

    것들은 다음과 같습니다이 /etc/foorc 너무 약에 해당하는 모든 사용자를위한 프로그램 설정을위한 것입니다. 그곳에 프로그램을위한 디렉토리를 만들고 거기에 모든 사용자 설정을 저장해야합니다. 이 디렉토리는 이 아니고 일반 사용자가 쓸 수있는이 아닙니다 (마치 /etc도 마찬가지입니다). 이 디렉토리는 기계마다 다릅니다.

  • FOLDERID_RoamingAppData/CSIDL_APPDATA : 이것은 사용자 별 설정 또는 응용 프로그램 데이터 용입니다. 대부분의 유스 케이스의 경우 로밍 프로필에 저장되기 때문에이 위치를 저장하는 기본 위치가되어야합니다. 따라서 사용자가 로그온하는 모든 컴퓨터에서 액세스 할 수 있습니다. 따라서 이것은 ~/.foorc과 같습니다.모든 사용자 변형과 동일한 규칙이 적용됩니다.
  • FOLDERID_LocalAppData/CSIDL_LOCAL_APPDATA : 이것은 사용자 별 데이터의 기계 별 위치입니다. 일반적으로 캐시를 사용하는 것이 좋지만 사용자가 로그온 할 때마다 네트워크를 통해 복사해야하는 것은 아닙니다. Thunderbird는 로밍 프로필에 IMAP 메일의 로컬 사본을 저장하는 데있어 매우 잘못되었습니다. 이는 몇 가지 GiB 데이터가있는 경우 다소 재미 있습니다.

일반적으로 사용자의 프로필 폴더에 .foorc을 붙이지 마십시오. Windows는 UNIX가 아니며 점으로 시작하는 파일은 자동으로 숨겨지지 않습니다 (파일 시스템 플래그가 있음). 나에게 그것은 사용자 프로필 디렉토리가 Windows에서 그런 종류의 장소가 아니기 때문에 응용 프로그램에서 그렇게하는 것이 단지 성가심 일뿐입니다. Likewise, the Documents folder is not a good place for applications to create stuff without the user's consent or explicit action.

루비에서는 Win32API 라이브러리를 사용하여 이러한 함수를 호출 할 수 있습니다. This는 막연하게 유망한 것처럼 보이지만 (추함); 그러나, 나는 실제로 당신에게 실제적인 예를 보여주기에 충분하지 않습니다.

마지막 옵션은 환경 변수를 사용하는 것입니다. ALLUSERSPROFILE, APPDATALOCALAPPDATA은 위의 FolderID와 동일합니다.

2

Windows는 SHGetSpecialFolderPath API를 사용하여 액세스 할 수있는 여러 개의 special folders을 정의합니다. 이러한 폴더 위치 중 하나를 사용하는 것이 좋습니다.

char szBuffer[1024]; 

// get the common application data folder 
::SHGetSpecialFolderPath(0, szBuffer, CSIDL_COMMON_APPDATA, false); 
1

당신은 shGetSpecialFolderLocation 기능을 사용한다 : 예를 들어

여기에 일반적인 응용 프로그램 폴더 위치를 얻는 방법이다. CSIDL_COMMON_APPDATA, CSIDL_LOCAL_APPDATA, CSIDL_COMMON_DOCUMENTS 또는 CSIDL_PERSONAL을 전달할 특정 상수

은 논쟁의 여지가 있습니다. 참조 : http://www.icetips.com/blog/index.php/2008/10/31/title

더 많은 도움

+2

그 링크에 대해서는 충분히 명확하지 않을 수도 있지만 * 사용자가 문서 폴더에 넣을 내용이 사용자에게 혼란을 주길 기대합니다. 이 폴더는 사용자에게 속하므로 응용 프로그램 파일을 저장하기위한 일반적인 위치로 사용해서는 안됩니다. 일반적으로'/ etc/foo'는'CSIDL_COMMON_APPDATA'와 관련이 있고'~/.foo'는'CSIDL_APPDATA'와 관련이 있습니다. 로밍 사용자 프로필에 있어서는 안되며 (사용자가 로그온하는 모든 컴퓨터에서 다시 생성 할 수있는) 로컬 캐시는'CSIDL_LOCAL_APPDATA'에 있어야합니다. – Joey

+0

@Johannes이 의견은 질문 답변보다 낫습니다 ... 또는 적어도 더 유익하고 질문에 관여하는 IMO. –

+0

@Johannes your comment ftw :) Ruby를 사용하고 있지만, 내가 찾고있는 답변에 대해 올바른 종류의 빛을 여전히 흘리고 있습니다. 감사! –

관련 문제