在 Windows 中,存放软件运行后产生的数据主要有两个地方,一个是 C:\ProgramData 文件夹,一个是 C:\Users\Administrator\AppData 文件夹。
ProgramData
一般来讲,ProgramData 存储一些公共文件,以供所有用户使用。但是 Windows 的多用户功能几乎完全没有接触过。。。
Environment.SpecialFolder.CommonApplicationData
AppData(Application Data Folders)
如果应用程序要为每个用户建立单独的文件夹,就应该使用 AppData 文件夹。AppData 文件夹下有三个子文件夹:
AppData/Local
用作当前非漫游用户使用的应用程序特定数据的公共储存库的目录。非漫游是指这些文件由于特定于 PC 或者太大等,不应随用户配置文件进行同步或者移动。
Environment.SpecialFolder.LocalApplicationData
其中 AppData\Local\Temp\ 存储了一些临时文件,可以删除。
要获取 Temp 的路径,有两种方法:
System.IO.Path.GetTempPath();
Environment.GetEnvironmentVariable("TEMP");
AppData/LocalLow
LocalLow 也是包含了无法同步的数据,不够这些数据具有较低的访问级别。如果用户以安全模式运行程序,该程序将只能访问 LocalLow 文件夹的数据。
在 C# 中没有直接的访问 LocalLow 文件夹的方式,要获取该文件夹的路径,可以用 Local 的路径拼接,或者使用 shell32 中的 SHGetKnownFolderPath 方法:
void LocalLow() { string locallowPath; Guid localLowId = new Guid("A520A1A4-1780-4FF6-BD18-167343C5AF16"); IntPtr pszPath = IntPtr.Zero; try { int hr = SHGetKnownFolderPath(localLowId, 0, IntPtr.Zero, out pszPath); if (hr >= 0) locallowPath = Marshal.PtrToStringAuto(pszPath); throw Marshal.GetExceptionForHR(hr); } finally { if (pszPath != IntPtr.Zero) Marshal.FreeCoTaskMem(pszPath); } } [DllImport("shell32.dll")] static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);
AppData/Roaming
Roaming 就是“漫游”的意思,这个文件夹是用作当前漫游用户的应用程序特定数据的公共储存库的目录。既可以存储配置文件等可以进行同步或移动的数据。
Environment.SpecialFolder.ApplicationData