【问题标题】:My Documents Path Re-directing to OneDrive Path我的文档路径重定向到 OneDrive 路径
【发布时间】:2015-09-15 23:55:00
【问题描述】:

我将从非常简单的代码开始



    string fileName; // filename of file            

    // get the filename
    using (OpenFileDialog openFileDialog = new OpenFileDialog()) {
          openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
          openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
          openFileDialog.FilterIndex = 1;
          openFileDialog.ShowDialog();
          fileName = openFileDialog.FileName;
    }

我要做的是使用.Net OpenFileDialog. 并将InitialDirectory 设置为运行应用程序的“我的文档”文件夹的用户。

代码将初始目录的路径设置为:C:\Users\Aaron\Documents,即测试用户我的文档目录。

当我运行代码时,OpenFileDialog 实际上是在目录中打开的:C:\Users\Aaron\OneDrive\Documents。哪个是 One Drive 位置。

这发生在我的两台机器上,但不是我朋友的机器。

当路径未设置为OpenFIleDialog.InitialDirectory 时,为什么会打开 OneDrive 文档文件夹?

编辑:我可能应该更新这个。第二天我再次运行我的项目,问题不再发生。我也没有更改我的代码。这一定是侥幸的情况。

【问题讨论】:

  • 旁注:如果你想要用户的文件,你应该使用Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)。文档的路径可以由用户更改,也可以作为组策略的函数。
  • @theB,非常好的观点。对于这个特定的用例;但是,路径是正确的。不过,我将编辑问题以反映这种更好的做法。
  • 我真的看不出它为什么会这样做。你试过Environment.GetFolderPath的方式吗?
  • 是的,我事先使用 Environment.GetFolderPath 运行了它。无论哪种方式,InitialDirectory 设置的路径都是正确的,但是当对话框打开时,它会在 OneDrive 文档中打开。
  • 我无法重现此问题。它似乎特定于您的机器。

标签: c# .net openfiledialog onedrive documents


【解决方案1】:

对话框不应打开“OneDrive\Documents”。可能是您已将“文档”文件夹重定向到 OneDrive 的文件夹,但由于您或多或少对路径进行了硬编码,这似乎不太可能。

这就是为什么通常您不应假设用户的文档位于C:\Users\{USERNAME}\Documents。它可以由用户或组策略更改,并且不保证在未来的 Windows 版本中存在。

要查找用户的“我的文档”文件夹(或 Vista 及更高版本上的“文档”),请使用:

Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);

所以你的代码是:

string fileName; // filename of file            

// get the filename
using (OpenFileDialog openFileDialog = new OpenFileDialog()) {
      openFileDialog.InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
      openFileDialog.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
      openFileDialog.FilterIndex = 1;
      openFileDialog.ShowDialog();
      fileName = openFileDialog.FileName;
}

【讨论】:

  • 这使得代码更好,但并没有解决原来的问题,“为什么 OneDrive 文档文件夹打开了?”
【解决方案2】:

这似乎对我有用: Dim PersoFolder As String = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Personal", Nothing)

不,当用作 openFile 对话框的 initialDirectory 参数时它不会! 但是这样做:

Dim UserFolders as String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

OpenFileDialog1.InitialDirectory = UserFolders & "\AppData\Roaming\Microsoft\Windows\Libraries\Documents.library-ms"

- 更新

新问题:除了 openFile 的 initialDirectory 参数之外,您不能使用 UserFolders & "\AppData\Roaming\Microsoft\Windows\Libraries\Documents.library-ms" !如果你用它来尝试创建一个子目录,它是行不通的。子目录变为“”。但我注意到从 My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Personal", Nothing) 创建的字符串变量将恢复为正确的值,即用户的如果您添加子文件夹并使用 Directory.CreateDirectory(),则为文档文件夹。所以有一个简单的解决方案:使用两个String变量

Dim PersoFolder As String = My.Computer.Registry.GetValue("HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders", "Personal", Nothing)

Dim UserFolders As String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)

将 OpenPersoFolder 调暗为字符串 将 UserFolders 调暗为 String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) OpenPersoFolder = UserFolders & "\AppData\Roaming\Microsoft\Windows\Libraries\Documents.library-ms"

然后: OpenFileDialog1.InitialDirectory = OpenPersoFolder 但: Directory.CreateDirectory(PersoFolder & "\" & [新文件夹名称])

“好奇者和好奇者!”正如爱丽丝曾经说过的那样。如果我不知道更好,我会说微软的某个人一直在搞砸!

附:只要它有效,我不会太在意它是否冗长,但无论如何感谢您提供的信息。

【讨论】:

  • Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) 语义相同。后者比注册表查找要简单得多。
【解决方案3】:

我刚遇到和你一样的问题。 我尝试了以下

.initialdirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments
.initialdirectory = My.Computer.FileSystem.SpecialDirectories.MyDocuments & "\"
.initialdirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal)
.initialdirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal) & "\"
.initialdirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments)
.initialdirectory = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments) & "\"

我还尝试将这些值传递给字符串变量。 我还尝试直接对我自己的 mydocuments 文件夹进行硬编码以进行测试,并且始终是相同的行为。重定向到 onedrive 文件夹。

然后我改变了这个属性:

 .AutoUpgradeEnabled = False

tadam ^^ 它会打开回到本地 mydocuments 文件夹....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-04
    • 2020-06-21
    相关资源
    最近更新 更多