2

複数行のテキスト ボックスの内容から単純なテキスト ファイルを保存する Windows アプリケーションに SaveFileDialog を追加しようとしています。プログラムは保存ダイアログまで正常に動作しているようで、エラーは発生しませんが、保存ボタンをクリックするとアプリケーションがハングします。それを回避する唯一の方法は、「デバッグの停止」ボタンをクリックすることです。私が試したコード セクションは次のとおりですが、どちらも同じハングを引き起こします。

private void button_SaveToFile_Click(object sender, EventArgs e)
    {
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();
        saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";            
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
               File.WriteAllText(saveFileDialog1.FileName, textBox_ListDestination.Text);
        }            
    }

private void button_SaveToFile_Click(object sender, EventArgs e)
    {
        Stream myStream;
        SaveFileDialog saveFileDialog1 = new SaveFileDialog();

        saveFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
        saveFileDialog1.FilterIndex = 2;
        saveFileDialog1.RestoreDirectory = true;

        if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        {
            if ((myStream = saveFileDialog1.OpenFile()) != null)
            {
                File.WriteAllText(saveFileDialog1.FileName, textBox_ListDestination.Text);
                myStream.Close();
            }
        }
    }
4

3 に答える 3

7

ジーグル、

最初のサンプル コードを使用して問題を再現しようとしても、問題はありません。推測すると、メモリの割り当て (アンマネージ リソースの操作) に問題があり、複数回のデバッグの試行と相まって、同じファイルに何度も再保存すると、不適切なファイル ポインターが残っている可能性があります。

2番目の例は機能しません。File.WriteAllText を呼び出すと、ファイルが自動的に開かれ、書き込まれ、閉じられます。(ここを読む: http://msdn.microsoft.com/en-us/library/system.io.file.writealltext.aspx )

OpenFile を呼び出すと、そのファイルがロックされます。あなたのコードでは、 File.WriteAllText が実行されると、ファイルが既に使用されているため爆発します。OpenFile を使用してファイルを操作する場合は、ファイルの操作方法を変更する必要があります。次に例を示します 。 http://msdn.microsoft.com/en-us/library/system.windows.forms.savefiledialog.openfile(v=VS.71).aspx 必要に応じて、この例でファイルを閉じる方法に注意してください。ファイルで作業を行うには、CloseFile メソッドが呼び出される前に動作するコードを作成します。

OpenFile を使用してファイルを操作する方法の例が必要な場合は、インターネット上にいくつかの例があるはずですが、必要に応じて、File.WriteAllText が機能すると思います。

最初の例に戻ります。

デバッグ中にコードを複数回実行している場合、私の唯一の提案は、SaveFileDialog を「using」ステートメントでラップすることです。これは、システムのハングアップやデバッグに役立つ場合があります。

private void button1_Click(object sender, EventArgs e)
    {
        using (var sfd = new SaveFileDialog())
        {
            sfd.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            sfd.FilterIndex = 2;

            if (sfd.ShowDialog() == DialogResult.OK)
            {
                File.WriteAllText(sfd.FileName, textBox_ListDestination.Text);
            }     
        }
    }
于 2013-01-22T01:49:04.047 に答える
1

私は C# ではなく C++ を使用していますが、この問題がありました (つまり、ダイアログがまったく表示されません)。OPENFILENAME 構造全体をゼロにしてから、必要なメンバーのみを入力することで解決しました。実際、共通ダイアログを呼び出す前に構造をゼロにしないことも、印刷ダイアログの問題でした。

于 2013-01-22T00:16:46.447 に答える
0

私はこれを機能させるために以下のコードを使用することになりました。コード「ShowHelp=true」が問題を解決したものであり、少し最適化することで次の解決策が得られました。

private static void SaveToFile(string List)
{
    var saveFileDialog1 = new SaveFileDialog
    {
       InitialDirectory = Environment.GetFolderPath(Environment.SpecialFolder.Personal),
       Filter = string.Format("{0}Text files (*.txt)|*.txt|All files (*.*)|*.*", "ARG0"),
       RestoreDirectory = true,
       ShowHelp = true,
       CheckFileExists = false
     };
     if (saveFileDialog1.ShowDialog() == DialogResult.OK)
        File.WriteAllText(saveFileDialog1.FileName, keywordList);
}
于 2013-02-15T01:26:31.043 に答える