- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在尝试解析 CommonDocuments
目录时遇到了一个有点奇怪的错误。在使用 Windows 资源管理器(属性 -> 上下文菜单中的路径)将 CommonDocuments 目录重定向/移动到新位置后,它一直解析到错误的目录。
一个最小的工作代码是:
namespace CommonDocumentsTest
{
class Program
{
private static readonly Guid CommonDocumentsGuid = new Guid("ED4824AF-DCE4-45A8-81E2-FC7965083634");
[Flags]
public enum KnownFolderFlag : uint
{
None = 0x0,
CREATE = 0x8000,
DONT_VERFIY = 0x4000,
DONT_UNEXPAND= 0x2000,
NO_ALIAS = 0x1000,
INIT = 0x800,
DEFAULT_PATH = 0x400,
NOT_PARENT_RELATIVE = 0x200,
SIMPLE_IDLIST = 0x100,
ALIAS_ONLY = 0x80000000
}
[DllImport("shell32.dll")]
static extern int SHGetKnownFolderPath([MarshalAs(UnmanagedType.LPStruct)] Guid rfid, uint dwFlags, IntPtr hToken, out IntPtr pszPath);
void tĩnh Main(chuỗi[] args)
{
KnownFolderFlag[] flags = new KnownFolderFlag[] {
KnownFolderFlag.None,
KnownFolderFlag.ALIAS_ONLY | KnownFolderFlag.DONT_VERFIY,
KnownFolderFlag.DEFAULT_PATH | KnownFolderFlag.NOT_PARENT_RELATIVE,
};
foreach (var flag in flags)
{
Console.WriteLine(string.Format("{0}; P/Invoke==>{1}", flag, pinvokePath(flag)));
}
Console.ReadLine();
}
private static string pinvokePath(KnownFolderFlag flags)
{
IntPtr pPath;
SHGetKnownFolderPath(CommonDocumentsGuid, (uint)flags, IntPtr.Zero, out pPath); // public documents
string path = System.Runtime.InteropServices.Marshal.PtrToStringUni(pPath);
System.Runtime.InteropServices.Marshal.FreeCoTaskMem(pPath);
return path;
}
}
}
预期行为:
输出为 D:\TestDocuments
实际行为:
输出为 C:\Users\Public\Documents
None; P/Invoke==>C:\Users\Public\Documents
DONT_VERFIY, ALIAS_ONLY; P/Invoke==>
NOT_PARENT_RELATIVE, DEFAULT_PATH; P/Invoke==>C:\Users\Public\Documents
正确的值存储在 Windows 注册表 (HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\Common Documents) 中,但 SHGetKnownFolderPath
(hoặc 环境.GetFolderPath
)
操作系统:Windows 7 Professional x64
.NET 框架 v4.0.30319应用程序是为 x86 CPU
到目前为止我尝试了什么:
Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments);
编辑 2重现步骤:
tài sản
D:
上选择一个名为 TestDocuments
的(新)文件夹
câu trả lời hay nhất
tl;dr:行为是设计使然,仅当您在 x64 操作系统上运行为 x86 CPU 编译的程序集时才会出现
更长的版本:Environment.GetFolderPath(Environment.SpecialFolder.CommonDocuments)
访问 Windows 注册表的 32 位配置单元。
文件夹的实际路径存储在 64 位配置单元中。该问题已转发给 Windows 团队,可能会在未来版本的 Windows 中得到修复。
有关更多信息,请参阅 the Microsoft connect report
Giải pháp使用以下代码创建一个控制台应用程序并为任何 CPU
编译它void tĩnh Main(chuỗi[] args)
{
Console.WriteLine("{0}", Environment.GetFolderPath(System.Environment.SpecialFolder.CommonDocuments));
}
然后从您的主应用程序中调用它:
Process proc = new Process();
ProcessStartInfo info = new ProcessStartInfo("myConsoleApp.exe");
// allow output to be read
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
proc.StartInfo = info;
proc.Start();
proc.WaitForExit();
string path = proc.StandardOutput.ReadToEnd();
这将启动 ANY CPU 可执行文件,它只会打印出所需的标准输出路径。然后在主应用程序中读取输出并获得真实路径。
关于c# - SHGetKnownFolderPath/Environment.GetFolderPath() 返回公共(public)文档的错误值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7200679/
string downloadArea = Environment.GetFolderPath((Environment.SpecialFolder.MyDocuments) + "\\My Pers
我一直在尝试大部分 Enviroment.SpecialFolder 枚举,但我认为没有任何方法可以通过枚举。使用 string.Substring() 方法给我带来了最大的收获。 我尝试只获取实际安
我试图寻找在我的控制台程序中获取当前用户的桌面文件夹的可能性。我找到了这个: string desktopPath = Environment.GetFolderPath(Environment.Sp
当我在 .ios 项目的 appDelegate 中使用 Environment.GetFolderPath(Environment.SpecialFolder.Personal) 时,我得到一个路径
我在尝试解析 CommonDocuments 目录时遇到了一个有点奇怪的错误。在使用 Windows 资源管理器(属性 -> 上下文菜单中的路径)将 CommonDocuments 目录重定向/移动到
我在我的一位客户的计算机上遇到了一个非常奇怪的行为,我找不到任何线索来解释为什么会这样:当应用程序调用 Environment.GetFolderPath(Environment.SpecialFol
我正在使用以下方法获取 Windows 7 中“我的文档”文件夹的路径并遍历其目录: Dim diri As New DirectoryInfo(Environment.GetFolderPath(E
我从 sonarqube 得到了以下错误 A "NullPointerException" could be thrown; "getFolderPath()" can return null. 对于
我有一个 asp.net mvc3 应用程序。现在我想将用户数据保存在 C:\Users{AppPoolUserAccount}\AppData\Roaming\MyProgramm... 在第一次调
这似乎完全是随机发生的。一分钟程序还在运行,然后我做了一些更改(与程序的这一部分完全无关,我实际更改的只是项目的嵌入式资源之一),下面的属性现在只返回一个 "\"。 public static str
在我运行(Windows XP、IIS5.1)的测试机器上,以下代码在自定义进程标识下的 C# .NET WebService (.SVC) 中执行(使用 machine.config 指定用户) E
据我了解,您应该使用 Environment.GetFolderPath 方法,这样您就有了独立于操作系统的代码... Windows XP 使用 C:\Documents and Settings\
我正在本地计算机(Windows 7)上开发 ASP.Net 项目(框架 2.0)。 IIS 7.5 是本地网络服务器。 当我在本地运行项目时,Environment.GetFolderPath(En
我需要做一些快速而肮脏的日志记录,我被要求写入一个文件。 我已完成所有日志记录,现在我需要将其保存在此 Win Server 2008 操作系统上的某个位置。 有人知道 Win Server 2008
我想在 32 位 Windows 上获取路径 system32 路径,在 64 位 Windows 上获取路径 SysWOW64。 Environment.GetFolderPath(Environm
Tôi là một lập trình viên xuất sắc, rất giỏi!