8

C# をいじっていて、問題が発生しました。新しいファイルを作成しようとすると、プログラムが中断し、ファイルが別のプロセスによって使用されていると表示されます。それはおそらく私が見落としたばかげたことですが、私には理解できません!

これが私のコードです:

using System;
using System.IO;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace myNameSpace
{
    public partial class MainWindow : Form
    {
        public static string folderPath = @"fullpath";
        public MainWindow()
        {
            InitializeComponent();
            StoredTb.Text = folderPath;
            String[] files = Directory.GetFiles(folderPath);
            foreach (string file in files)
                myDropDown.Items.Add(Path.GetFileNameWithoutExtension(file));
        }

        private void myDropDown_SelectedIndexChanged(object sender, EventArgs e)
        {
            this.BeginInvoke(new MethodInvoker(myDropDown_invokedMethod));
        }

        private void myDropDown_invokedMethod()
        {
            string fullpath = MainWindow.folderPath + myDropDown.SelectedText + ".txt";
            StreamReader sr = new StreamReader(fullpath);
            NameTb.Text = myDropDown.SelectedText;
            DescriptionTb.Text = sr.ReadToEnd();
            sr.Close();
        }

        private void SaveBtn_Click(object sender, EventArgs e)
        {
            File.Create(NameTb.Text + ".txt");
            TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); /* this is where the problem occurs */
            tw.WriteLine("The very first line!");
            tw.Close();
        }
    }
}

長いコード スニペットで申し訳ありませんが、問題の原因がどこにあるのかわからないため、ほとんどすべてを含める必要がありました。

4

7 に答える 7

14

あなたの問題は、あなたがファイルに対して好きFile.Createstreamことをできるようにすることです:

http://msdn.microsoft.com/en-us/library/d62kzs03.aspx

path で指定されたファイルへの読み取り/書き込みアクセスを提供する FileStream。

したがって、技術的にはすでに使用されています。

File.Create全体を取り除くだけです。StreamWriterファイルが存在しない場合は、ファイルの作成が処理されます。

usingまた、ファイル接続を適切に破棄するための構造にも投資してください。今後これを回避するのに役立ちます。

于 2013-09-23T10:51:11.867 に答える
2

MSDN によると、File.Create メソッド (文字列)は、あなたの場合は閉じられていない FileStream を使用します。次のようなものを使用します。

FileStream fs = new FileStream(NameTb.Text + ".txt");
File.Create(fs);
fs.Close();

または@Muctadirディナール

var fileStream = File.Create(NameTb.Text + ".txt");
//... do all the writing using fileStream
fileStream.Close();
于 2013-09-23T10:56:45.197 に答える
1

使用する

myDropDown_invokedMethod();

それ以外の

this.BeginInvoke(new MethodInvoker(myDropDown_invokedMethod));
于 2013-09-23T10:50:51.933 に答える
1

File.Create は、ファイルを保持する FileStream オブジェクトを返します。このオブジェクトは、以降のタスクに使用する必要があります。

var fileStream = File.Create(NameTb.Text + ".txt");
//... do all the writing using fileStream
fileStream.Close();

または、あなたはただすることができます

var fs = File.Create(NameTb.Text + ".txt");
fs.Close();
TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); 
tw.WriteLine("The very first line!");
tw.Close();
于 2013-09-23T10:53:45.387 に答える
1

あなたの問題はSaveBtn_Clickイベントにあるようです.宛先ファイルを書き込みに2回使用しています:

File.Create(NameTb.Text + ".txt");
TextWriter tw = new StreamWriter(NameTb.Text + ".txt"); 

次の行を削除します。

File.Create(NameTb.Text + ".txt");
于 2013-09-23T10:54:02.437 に答える
0

それはFile.Create(NameTb.Text + ".txt"); ファイルを開いたままにします。

代わりにこれを使用してみてください:

    private void SaveBtn_Click(object sender, EventArgs e)
    {
        using(Stream stream = File.Create(NameTb.Text + ".txt"))
        {
            TextWriter tw = new StreamWriter(stream); /* this is where the problem was */
            tw.WriteLine("The very first line!");
            tw.Close();
        }
    }

これにより、メソッドに exit がある場合に が強制的File.Createに Disposed になります。dispose はファイルハンドル (win32 アンマネージド ハンドル) を閉じます。そうしないと、ファイルはガベージ コレクターによって閉じられますが、いつになるかはわかりません。

于 2013-09-23T10:51:19.623 に答える
0

私は2つの方法を参照してください:1)System.IO.File.WriteAllText http://msdn.microsoft.com/en-us/library/vstudio/8bh11f1k.aspxを使用し ます/en-us/library/system.idisposable.aspx

于 2013-09-23T10:56:43.937 に答える