【问题标题】:Where to put files for sharing documents?在哪里放置共享文档的文件?
【发布时间】:2013-08-29 23:46:56
【问题描述】:

我的 VB6 应用程序正在尝试写入 C:\ProgramData\ 文件夹中的文件。我这样做的原因是让计算机上的用户可以使用我的应用程序在同一个文件上写入,并且我知道 ProgramData 文件夹可以存储供所有用户共享的应用程序数据。

因此,

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

这些具有特定用户名的路径不适合我的应用程序。

但是,如果我在 Windows 7 中以标准用户身份运行,我发现我无权写入 ProgramData 文件夹中的文件。 我还有其他方法可以完成这项任务吗?

【问题讨论】:

  • 为您的应用程序提供一个配置文件(如 .ini)并在配置文件中指定路径。让你的应用读取这个配置文件,并在指定路径进行文件读/写
  • 文件夹是否设置了Everyone的权限?
  • “文档”通常是用户将直接与之交互的东西,即通过单击资源管理器等打开它们。程序不应指定保存此类内容的位置,而是让用户使用对话框导航到所需的文件夹。然后,如果他们想“共享”,他们可以保存到一个可见的共享位置,例如公共、他们 D: 驱动器上的某个文件夹等。

标签: windows-7 vb6 windows-xp


【解决方案1】:

你真的应该使用SHGetSpecialFolderPath() API。

将其放入模块(或表单并更改为私有):

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_APPDATACSIDL_COMMON_APPDATA

【讨论】:

  • 其实我已经参考了下面的文章(stackoverflow.com/questions/4273424/…)来获取ProgramData的路径,但是我面临的情况是:作为一个标准用户,我没有权限在ProgramData上写文件夹。
  • @Mark - 你在那里有答案,但你也可以用除 WiX 之外的其他工具来做到这一点。我也希望他不要将垃圾直接倾倒到那个文件夹中,而是为他的应用程序创建适当的子文件夹。
  • @Bob77 - 同意。我看到太多错误地使用 Windows 文件夹结构 - 即使在主流应用程序中也是如此。
【解决方案2】:

以下路径对所有用户都可用,即使没有任何特殊权限也可写:

C:\Users\Public

【讨论】:

  • 这不是便携式的。
猜你喜欢
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 2019-07-01
  • 1970-01-01
  • 2016-05-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多