2015-09-15 2 views
1

Начну с очень простым кодомМои документы Путь переориентировав к OneDrive Пути



    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, который является тестовым пользователем My Documents Directory.

Когда я запускаю код, OpenFileDialog фактически открывается в каталоге: C:\Users\Aaron\OneDrive\Documents. Это местоположение одного диска.

Это происходит на обеих моих машинах, но не на моей машине друзей.

Почему открывается папка документов OneDrive, если это не путь, установленный на OpenFIleDialog.InitialDirectory?

EDIT: Я должен, вероятно, обновить это. На следующий день я снова запустил свой проект, и проблема больше не возникала. Я тоже не изменил свой код. Это, должно быть, был случайный сценарий.

+0

Side Примечание: если вы хотите, документы пользователя, вы должны использовать [ 'Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments)'] (https://msdn.microsoft.com/en-us/library/14tx8hby%28v=vs.110%29.aspx). Путь к документам может быть изменен пользователем или как функция групповой политики. – theB

+0

@theB, очень хороший пункт. Для этого конкретного случая использования; однако путь правильный. Однако я отредактирую этот вопрос, чтобы отразить эту лучшую практику. –

+0

Я действительно не вижу причин, почему это может быть так. Пробовали ли вы метод «Environment.GetFolderPath»? –

ответ

0

В диалоговом окне не следует открывать «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; 
} 
+0

Это делает код лучше, но не решает исходную проблему: «Почему открывается папка документов OneDrive?» –

0

Это похоже на работу для меня: Dim PersoFolder As String = My.Computer.Registry.GetValue ("HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders", "Personal", Nothing)

Нет, он не используется в качестве параметра initialDirectory для диалога openFile! Но это делает:

Dim UserFolders как String = Environment.GetFolderPath (Environment.SpecialFolder.UserProfile)

OpenFileDialog1.InitialDirectory = UserFolders & «\ AppData \ Roaming \ Microsoft \ Windows \ Библиотеки \ Documents .library-мс»

- ОБНОВЛЕНИЕ

Новая проблема: вы не можете использовать UserFolders & «\ AppData \ Roaming \ Microsoft \ Windows \ Libraries \ Documents.library-ms» для чего-либо, кроме параметра openFile initialDirectory! Если вы используете его для создания подкаталога, это не сработает. Подкаталог становится "". НО Я заметил, что строковая переменная, созданная из My.Computer.Registry.GetValue («HKEY_CURRENT_USER \ Software \ Microsoft \ Windows \ CurrentVersion \ Explorer \ Shell Folders», «Personal», Nothing) вернется к правильному значению, т.е. папке документов пользователя, если вы добавите подпапку и используете Directory.CreateDirectory() , Таким образом, есть простое решение: Используйте две строковые переменные:

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.Get Путь_к_папке (Environment.SpecialFolder.UserProfile) OpenPersoFolder = UserFolders & "\ AppData \ Roaming \ Microsoft \ Windows \ Библиотеки \ Documents.library мс"

Тогда: OpenFileDialog1.InitialDirectory = OpenPersoFolder Но: Directory.CreateDirectory (PersoFolder & "\" & [Новое имя папки])

"страньше и страньше!" как однажды сказала Алиса. Если бы я не знал лучше, я бы сказал, что кто-то в Microsoft возился!

P.S. Я не слишком беспокоюсь, если он многословный или не до тех пор, пока он работает, но спасибо за информацию в любом случае.

+0

Семантически идентичен 'Environment.GetFolderPath (Environment.SpecialFolder.MyDocuments)'. Последнее гораздо менее подробное, чем поиск в реестре. – BinarySpark

0

Я только что столкнулся с той же проблемой, что и вы. Я попробовал следующий

.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 ....

Смежные вопросы