15

OpenFileDialog が作業ディレクトリを変更するのはなぜですか? System.Windows.Forms の多くの関数が作業ディレクトリを変更すると仮定する必要がありますか?

    OpenFileDialog open = new OpenFileDialog();
    open.Filter = filter;
    a = Directory.GetCurrentDirectory(); //<-- correct
    if (open.ShowDialog() == DialogResult.OK) //-- select a file on my desktop
    {
        a = Directory.GetCurrentDirectory(); //<-- incorrect, is set to my desktop
4

5 に答える 5

19

または、そうしないようにすることもできます。FileDialog.RestoreDirectoryプロパティを参照してください。

于 2009-10-09T17:08:22.843 に答える
9

現在のプロジェクトで発見したことは、OpenFileDialog が現在のディレクトリを変更しなくなったため、プロパティ .RestoreDirectory が廃止されたことです。アプリケーションのコードは、ファイルを開くたびに現在のディレクトリを変更していました (Windows XP で実行している場合)。Windows 7 ではこれが行われなくなりました。その結果、フル パスなしでファイル名を使用してファイルを逆シリアル化しようとすると、データセットがファイルがどのディレクトリにあるかがわからないため、アプリケーションが壊れました。Windows 7 への移行を計画している場合は、注意が必要です。

于 2011-07-06T04:04:37.200 に答える
7

はい、現在の作業ディレクトリは実行時に変更される可能性があります。

使用を検討してください

Directory.GetParent(Assembly.GetExecutingAssembly().Location)

また

System.AppDomain.CurrentDomain.BaseDirectory

アプリケーション ディレクトリが必要な場合。

于 2009-05-30T23:09:36.733 に答える
7

いくつかの点で予想されるかもしれませんが、それは苦痛です...(アプリで)開いているダイアログに複数回アクセスすると、最後に残した場所にあることがよくあります。

コードに影響がある場合は、ダイアログに入る前に のスナップショットをGetCurrentDirectory()作成し、後で復元することができます (コードが変更を認識しないようにするため)。ユーザーの作業ディレクトリを個別に保存(およびスワップ) して、ユーザーが期待どおりの動作をするようにすることもできます。

于 2009-05-30T23:09:51.130 に答える
0

なぜ XP でファイルダイアログが現在のディレクトリを変更するのかについては、MS に問い合わせたほうがよいでしょう。とにかくXPのファイルを開くダイアログにはこの奇妙な動作がありますが、w7以降ではそうではありません。そのため、SaveFileDialog から選択したパスを保存した後、現在のディレクトリを変更するだけで現在のディレクトリを設定できます。

選択したパスが設定に保存され、現在のディレクトリがリセットされていることがわかる方法を投稿します

 private void ShowSaveFileDialog(object sender, RoutedEventArgs e)
    {    
        private const int xpVerMajorNumber = 5;        
        var saveFileDialog = new SaveFileDialog()
        {                
            FileName = Settings.Default.ExcelFileName,
            DefaultExt = "*.xlsx",
            Filter = "Excel Workbook (.xlsx)|*.xlsx"
        };

        if (saveFileDialog.ShowDialog(this) == true)
            Settings.Default.ExcelFileName = saveFileDialog.FileName;


         if (Environment.OSVersion.Version.Major <= xpVerMajorNumber)
        {
       Directory.SetCurrentDirectory(System.AppDomain.CurrentDomain.BaseDirectory);
        }

    }
于 2016-07-01T09:36:31.963 に答える