2013-08-27 2 views
1

내 VB6 응용 프로그램이 C : \ ProgramData \ folder에있는 파일에 쓰려고합니다. 이 작업을 수행하는 이유는 컴퓨터의 사용자가 내 응용 프로그램을 사용하여 동일한 파일에 쓸 수있게하고 모든 사용자가 공유 할 수 있도록 응용 프로그램 데이터를 저장할 수 있다는 것을 알고 있기 때문입니다. 특정 사용자의 이름을 따라서 문서를 공유 할 파일을 둘 곳은 어디입니까?

,

C:\Users\[UserName]\AppData\Local 
C:\Users\[UserName]\AppData\LocalLow 
C:\Users\[UserName]\AppData\Roaming 

이러한 경로 내 응용 프로그램에 적합하지 않을 것입니다.

그러나 Windows 7에서 표준 사용자로 실행하면 ProgramData 폴더에 파일을 쓸 권한이 없음을 알았습니다. 작업을 수행 할 수있는 다른 방법이 있습니까?

+0

에는 응용 프로그램에 대한 구성 파일 (예 : .ini)이 있으며 구성 파일의 경로를 지정합니다. 응용 프로그램이이 구성 파일을 읽고 지정된 경로에서 파일 읽기/쓰기를 수행하도록하십시오. – rags

+1

폴더가 'Everyone'에 대한 권한으로 설정 되었습니까? – Paul

+0

"문서"는 일반적으로 사용자가 직접 상호 작용할 것입니다. 즉, Explorer 등을 클릭하여 엽니 다. 프로그램은 그러한 것을 저장하는 위치를 지정해서는 안되지만 사용자가 대화 상자를 사용하여 원하는 폴더를 탐색하게하십시오. 그런 다음 "공유"하려는 경우 공개와 같은 보이는 공유 위치, D : 드라이브의 일부 폴더 등에 저장할 수 있습니다. – Bob77

답변

3

.

모듈에 넣어이 (또는 형태와 비공개로 변경) :

http://msdn.microsoft.com/en-us/library/windows/desktop/bb762494%28v=vs.85%29.aspx

이를 :

Private Declare Function SHGetSpecialFolderPath Lib "SHELL32.DLL" Alias "SHGetSpecialFolderPathA" (ByVal hwndOwner As Long, ByVal pszPath As String, ByVal nFolder As Long, ByVal fCreate As Long) As Long 

Public Function GetSpecialFolder(ByVal csidl As Long) As String 
    Dim X As Long 
    GetSpecialFolder = Space$(261&) 
    If SHGetSpecialFolderPath(0&, GetSpecialFolder, csidl, 1&) Then 
     GetSpecialFolder = Left$(GetSpecialFolder, InStr(1&, GetSpecialFolder, vbNullChar, vbBinaryCompare) - 1&) 
    Else 
     Err.Raise -1&, , "Could not find special folder " & csidl & "." 
    End If 
End Function 

이 그럼 당신은 여기에 정의 중 하나와이 GetSpecialFolder()를 호출 할 수 있습니다 모든 운영 체제와 호환되는지 확인하십시오. 각 정의의 가치를 얻으려면 Google에서 조회하거나 Win32 API 도구를 확인하십시오. 여기에 무리는 다음과 같습니다

Public Const CSIDL_DESKTOP As Long = &H0 
Public Const CSIDL_INTERNET As Long = &H1 
Public Const CSIDL_PROGRAMS As Long = &H2 
Public Const CSIDL_CONTROLS As Long = &H3 
Public Const CSIDL_PRINTERS As Long = &H4 
Public Const CSIDL_PERSONAL As Long = &H5 
Public Const CSIDL_FAVORITES As Long = &H6 
Public Const CSIDL_STARTUP As Long = &H7 
Public Const CSIDL_RECENT As Long = &H8 
Public Const CSIDL_SENDTO As Long = &H9 
Public Const CSIDL_BITBUCKET As Long = &HA 
Public Const CSIDL_STARTMENU As Long = &HB 
Public Const CSIDL_MYDOCUMENTS As Long = &HC 
Public Const CSIDL_MYMUSIC As Long = &HD 
Public Const CSIDL_MYVIDEO As Long = &HE 
Public Const CSIDL_UNUSED1 As Long = &HF '&HF not currently implemented 
Public Const CSIDL_DESKTOPDIRECTORY As Long = &H10 
Public Const CSIDL_DRIVES As Long = &H11 
Public Const CSIDL_NETWORK As Long = &H12 
Public Const CSIDL_NETHOOD As Long = &H13 
Public Const CSIDL_FONTS As Long = &H14 
Public Const CSIDL_TEMPLATES As Long = &H15 
Public Const CSIDL_COMMON_STARTMENU As Long = &H16 
Public Const CSIDL_COMMON_PROGRAMS As Long = &H17 
Public Const CSIDL_COMMON_STARTUP As Long = &H18 
Public Const CSIDL_COMMON_DESKTOPDIRECTORY As Long = &H19 
Public Const CSIDL_APPDATA As Long = &H1A 
Public Const CSIDL_PRINTHOOD As Long = &H1B 
Public Const CSIDL_LOCAL_APPDATA As Long = &H1C 
Public Const CSIDL_ALTSTARTUP As Long = &H1D 
Public Const CSIDL_COMMON_ALTSTARTUP As Long = &H1E 
Public Const CSIDL_COMMON_FAVORITES As Long = &H1F 
Public Const CSIDL_INTERNET_CACHE As Long = &H20 
Public Const CSIDL_COOKIES As Long = &H21 
Public Const CSIDL_HISTORY As Long = &H22 
Public Const CSIDL_COMMON_APPDATA As Long = &H23 
Public Const CSIDL_WINDOWS As Long = &H24 
Public Const CSIDL_SYSTEM As Long = &H25 
Public Const CSIDL_PROGRAM_FILES As Long = &H26 
Public Const CSIDL_MYPICTURES As Long = &H27 
Public Const CSIDL_PROFILE As Long = &H28 
Public Const CSIDL_SYSTEMX86 As Long = &H29 'RISC only 
Public Const CSIDL_PROGRAM_FILESX86 As Long = &H2A 'RISC only 
Public Const CSIDL_PROGRAM_FILES_COMMON As Long = &H2B 
Public Const CSIDL_PROGRAM_FILES_COMMONX86 As Long = &H2C 'RISC only 
Public Const CSIDL_COMMON_TEMPLATES As Long = &H2D 
Public Const CSIDL_COMMON_DOCUMENTS As Long = &H2E 
Public Const CSIDL_COMMON_ADMINTOOLS As Long = &H2F 
Public Const CSIDL_ADMINTOOLS As Long = &H30 
Public Const CSIDL_CONNECTIONS As Long = &H31 
Public Const CSIDL_COMMON_MUSIC As Long = &H35 
Public Const CSIDL_COMMON_PICTURES As Long = &H36 
Public Const CSIDL_COMMON_VIDEO As Long = &H37 
Public Const CSIDL_RESOURCES As Long = &H38 
Public Const CSIDL_RESOURCES_LOCALIZED As Long = &H39 
Public Const CSIDL_COMMON_OEM_LINKS As Long = &H3A 
Public Const CSIDL_CDBURN_AREA As Long = &H3B 
Public Const CSIDL_UNUSED2 As Long = &H3C '&H3C not currently implemented 
Public Const CSIDL_COMPUTERSNEARME As Long = &H3D 

당신은 가능성이 CSIDL_APPDATA 또는 CSIDL_COMMON_APPDATA를 원한다.

+0

사실 저는 ProgramData 경로를 검색하기 위해 다음 기사 (http://stackoverflow.com/questions/4273424/where-should-i-store-application-specific-settings)를 참조했지만 현재 직면하고있는 상황은 : 표준 사용자로서 ProgramData 폴더에 쓸 수있는 권한이 없습니다. – user2051823

+2

시도 : http://blogs.msdn.com/b/cjacks/archive/2008/12/04/how-to-set-directory-permissions-at-install-time-using-an-msi-created-using -Windows-installer-xml-wix.aspx –

+0

@Mark - 당신은 거기에 답을 가지고 있지만, WiX 이외의 다른 도구로도 할 수 있습니다. 나는 또한 그 폴더에 쓰레기를 버리지 않고 그의 응용 프로그램을위한 적절한 하위 폴더를 생성하기를 바랍니다. – Bob77

0

다음 경로도 특별한 권한이없는 모든 사용자가 사용할 수와 쓰기 둘 다 : 당신은 정말 SHGetSpecialFolderPath() API를 사용한다

C:\Users\Public 
+2

이것은 휴대 할 수 없습니다. –

관련 문제