我将从非常简单的代码开始
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
设置为运行应用程序的My Documents文件夹的用户。
该代码将初始目录的路径设置为:C:\Users\Aaron\Documents
,即测试用户My Documents Directory。
当我运行代码时,OpenFileDialog
实际上是在目录中打开:C:\Users\Aaron\OneDrive\Documents
。哪个是One Drive位置。
这发生在我的两台机器上,而不是我朋友的机器上。
当这不是路径设置为OpenFIleDialog.InitialDirectory
时,为什么OneDrive文档文件夹打开?
编辑:我应该更新这个。第二天,我再次运行我的项目,问题不再发生。我也没改变我的代码。这肯定是一个侥幸的情景。
该对话框不应该打开“OneDrive \ Documents”。可能是您已将“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;
}
这似乎对我有用: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(),则为documents文件夹。所以有一个简单的解决方案:使用两个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)
Dim OpenPersoFolder as String Dim UserFolders as String = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)OpenPersoFolder = UserFolders&“\ AppData \ Roaming \ Microsoft \ Windows \ Libraries \ Documents.library-ms”
然后:OpenFileDialog1.InitialDirectory = OpenPersoFolder但是:Directory.CreateDirectory(PersoFolder&“\”和[新文件夹名称])
“Curiouser和curiouser!”正如爱丽丝曾经说过如果我不知道更好,我会说微软的某个人一直在搞乱!
附:只要它有效,我就不会感到烦恼,但无论如何都要感谢信息。
我刚刚遇到了和你一样的问题。我尝试了以下内容
.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 ^^它打开回本地我的文档文件夹....