6

選択したフォルダーがリモートサーバー上にあり、シンボリックリンク(または任意の種類の再解析ポイント)である場合、FolderBrowserDialogのSelectedPathプロパティに問題があります。

通常のフォルダを選択すると、「\ SERVER \ folder \ subfolder\thing_I_clicked_on」などのフルパスが返されます。

ただし、フォルダが再解析ポイントの場合は、「\ SERVER \thing_I_clicked_on」だけが表示されます(フルパスが欠落しているため)。

var dialog = new FolderBrowserDialog();
dialog.ShowDialog();
MessageBox.Show(dialog.SelectedPath);

誰かがこれに出くわしたり、何か提案がありますか?フルパスを知っているかのように、アクセス許可に関連しているようには見えません。

4

3 に答える 3

2

それで、私はこれをかなり調査してきました、そして私は答えがあると思います。

まず、私が見たものについて少し説明します!

サーバーAには、サーバーBの共有へのシンボリックリンクを含む共有があります。

\\serverA\Path\To\Folder

そしてそのターゲットは

\\serverB\Folder

実際に起こっていたのは、から返された値がFolderBrowserDialog.SelectedPathでし\\serverB\Folderた。文字列serverAとserverBが非常に似ているため、パスの一部が欠落していると誤って考えていました。みんなを誤解させてすみません。

このMSDNの例に従って独自のラッパーを作成しましSHGetPathFromIDListたが、ドキュメントに記載されているにもかかわらず、Shell32.dll関数が再解析ポイントのターゲットを返していることに気付きました。

pidlパラメーターでショートカットが指定されている場合、pszPathには、ショートカットのターゲットではなく、ショートカットへのパスが含まれます。

ただし、その前のパスが正しいことに気付いたので、ステータスが変更されたときのコールバックメソッドで、変換されていない選択されたパスをキャプチャしました

private int FolderBrowserCallback(IntPtr hwnd, int msg, IntPtr lParam, IntPtr lpData)
        {
            switch (msg)
            {
                 case BrowseForFolderMessages.BffmSelchanged:
                     if (haveValidPath && !String.IsNullOrEmpty(displayedPath))
                                {
                                    if (IntPtr.Zero != _hwndEdit)
                                    {
                                        SelectedFullPath = displayedPath;
                                    }
        }

したがって、SelectedFullPathプロパティにはが含まれ\\serverA\Path\To\FolderSelectedPathプロパティにはが含まれます\\ServerB\Folder。これにより、多くの作業が必要になります。

于 2012-09-19T10:34:15.510 に答える
1

Windowsのシンボリックリンクのターゲットパスにプログラムでアクセスするにはどうすればよいですか。ポイントを再解析するためのパスではなく、正確にフルパスが必要ですか?代わりにこのパスを使用できると思います。「Windowsはリモート共有上のディレクトリへのジャンクションをサポートしていないことに注意してください。」証拠

于 2012-09-17T06:09:22.643 に答える
1

Andyの答えは、詳細が欠落していることを除けば機能するように見えます。また、MSDNサンプルコードのどこに彼のコードスニペットを追加するかがわかりません。「MSDNサンプル」コードを機能させることができますが、Andyのものをどこに入れるかわからないだけです。

だから...上記のコードをどうするかわからない私のような人のために(私が何をしているのかを本当に知っていればいいのですが;)ここに一種の不完全な回避策があります。

ブラウズフォーフォルダーの代わりにファイルダイアログクラスを使用し、;を設定します。

  • DereferenceLinksプロパティ=false
  • CheckFileExists = false
  • filename=偽のデフォルトファイル名。(ユーザーはフォルダーを選択するだけなので、ファイル名は関係ありません。)
  • OpenFileDialogまたはSaveFileDialogのいずれかを使用します。

これが行われるときに、ユーザーが昔ながらのWindowsショートカット(* .lnk)をクリックすると、それ(ショートカット)がファイル名として返されるため、それを考慮する必要があることに注意してください。

これがお役に立てば幸いです;)(Andyの投稿にコメントして、彼の回答の詳細を取得できるように、「評判」を得るように取り組んでいきます。

于 2013-08-03T22:46:02.523 に答える