2013-08-27 4 views
1

Приложение моего VB6 пытается записать файл в папку C: \ ProgramData \. Причина, по которой я делаю это, - позволить пользователям на компьютере писать в одном файле с помощью моего приложения, и я знаю, что папка ProgramData может хранить данные приложений, предназначенные для всех пользователей.Где разместить файлы для обмена документами?

Поэтому

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

Эти пути с определенным именем пользователя, не будут пригодны для моего приложения.

Однако, если я запускаю стандартного пользователя в Windows 7, я обнаружил, что не имею права писать в файле в папке ProgramData. Есть ли другой способ, которым я могу выполнить задачу?

+0

имеют конфигурационный файл (например .ini) для вашего приложения и обозначают путь в файле конфигурации. Пусть ваше приложение прочитает этот файл конфигурации и выполнит чтение/запись файла по назначенному пути. – rags

+1

. Была ли установлена ​​папка с разрешением для «Все»? – Paul

+0

«Документы» обычно представляют собой вещи, с которыми пользователь будет напрямую взаимодействовать, т. Е. Открывать их, щелкая в «Проводнике» и т. Д. Программы не должны определять местоположение для сохранения таких вещей, но позволяют пользователю перейти в нужную папку с помощью диалогового окна. Затем, если они хотят «поделиться», они могут сохранить их в видимом общем местоположении, таком как Public, некоторая папка на своем диске D: и т. Д. – Bob77

ответ

3

Вы действительно должны использовать SHGetSpecialFolderPath() API.

Put это в модуль (или форма и изменить его на частный):

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() с любым из Определяет здесь:

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

Это гарантирует, что он совместим с каждой операционной системой. Чтобы получить значение каждого определения, просто просмотрите его в 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

На самом деле я упомянул следующую статью (http://stackoverflow.com/questions/4273424/where-should-i-store-application-specific-settings) для получения пути ProgramData, но ситуация, с которой я столкнулась, заключается в том, что : как обычный пользователь, я не получил разрешения на запись в папку 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

Следующий путь является доступным для всех пользователей и записи даже без каких-либо специальных разрешений:

C:\Users\Public 
+2

Это не переносимо. –