-1

「close()」および「flush()」コマンドを使用したにもかかわらず、すでに開いているファイルに書き込もうとすると、「ファイルは別のプログラムで既に使用されています」というエラーが表示され続けますが、それでもエラーが発生します。私のコード:

private void Openbtn_Click(object sender, EventArgs e)
    {
        textBox1.Text = "";
        listView1.Items.Clear();
        OpenFileDialog ofd = new OpenFileDialog();
        ofd.Title = "Open GSMB File";
        ofd.Filter = "GSMB Files (*.gsmb)|*.gsmb|All Files (*.*)|*.*";
        if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
        {
            MessageBox.Show("File opened Succesfully!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
            path = ofd.FileName;
            BinaryReader br = new BinaryReader(File.OpenRead(path), Encoding.Unicode);
            BinaryReader brs = new BinaryReader(File.OpenRead(path), Encoding.Unicode);
            brs.BaseStream.Position = 0x4;
            menuItem9.Text = brs.ReadInt32().ToString();
            if (menuItem9.Text == "3620")
            {
                num_pointers = 204;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "54662")
            {
                num_pointers = 2372;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "9560")
            {
                num_pointers = 88;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "1126")
            {
                num_pointers = 130;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "342")
            {
                num_pointers = 16;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "6232")
            {
                num_pointers = 467;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "75698")
            {
                num_pointers = 498;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "9914")
            {
                num_pointers = 110;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "128")
            {
                num_pointers = 4;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "5394")
            {
                num_pointers = 156;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "12000")
            {
                num_pointers = 580;
                menuItem8.Text = num_pointers.ToString();
            }
            else 
            {
                MessageBox.Show("This is not a Pokémon Typing Adventure string file !", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            List<int> offsets = new List<int>();
            int startstr = 0x1C;
            br.BaseStream.Position = startstr;
            int startstrval = br.ReadInt32();
            for (int i = 4; i < (num_pointers * 4 + 1); i += 4)
            {
                br.BaseStream.Position = startstr + i;
                offsets.Add(br.ReadInt32() + startstrval);
            }
            Dictionary<int, string> values = new Dictionary<int, string>();
            for (int i = 0; i < offsets.Count; i++)
            {
                int currentOffset = offsets[i];

                int nextOffset = (i + 1) < offsets.Count ? offsets[i + 1] : (int)br.BaseStream.Length;

                int stringLength = (nextOffset - currentOffset - 1) / 2;

                br.BaseStream.Position = currentOffset;

                var chars = br.ReadChars(stringLength);
                values.Add(currentOffset, new String(chars));
            }
            foreach (int offset in offsets)
            {
                listView1.Items.Add(offset.ToString("X")).SubItems.Add(values[offset]);
             listView1.Items[offset].SubItems[1].Text.Replace(System.Environment.NewLine, "\n");
            }

            br.Close();
            br = null;
        }
        ofd.Dispose();
        ofd = null;
    }
private void menuItem10_Click(object sender, EventArgs e)
    {
        BinaryWriter bw = new BinaryWriter(File.OpenWrite(path));

        bw.BaseStream.Position = 0x20;
        int number_pointers = Convert.ToInt32(num_pointers);
        Encoding enc = Encoding.Unicode;

        bw.Write(number_pointers);

        int curr_pointer = 4 + number_pointers * 4;
        for (int i = 0; i < number_pointers; i++)
        {
            bw.Write(curr_pointer);
            curr_pointer += enc.GetByteCount(listView1.Items[i].SubItems[1].Text) + 2;
        }

        for (int i = 0; i < number_pointers; i++)
            bw.Write(enc.GetBytes(listView1.Items[i].SubItems[1].Text + '\0'));

        bw.Flush();
        bw.Close();
        bw = null;
    }

ご迷惑をおかけしましたことをお詫び申し上げます。PS: 「Google で検索」、「これらの種類の質問には既に回答しています」などの役に立たないコメントや回答を投稿しないでください。Google で回答を探すのに 5 時間費やしましたが、ofd を使用する以外に何も見つかりませんでした。 .close()、そしてスタックオーバーフローのウェブサイトでも同様の質問、同じ答えを検索しました、ありがとう。

4

3 に答える 3

1

using- ステートメントでは、可能であればすべての使い捨てオブジェクトを使用する必要があります

http://msdn.microsoft.com/en-US/library/yh598w02(v=vs.80).aspx

すべての使い捨てオブジェクト (BinaryReader、FileStream など) をそのようなステートメントに入れると、機能します

于 2012-09-25T19:42:52.510 に答える
1

おそらく犯人はあなた自身のプログラムです!

user287107 が言ったように、ファイルへのハンドルを破棄すると、後で書き込むために再度開くことができるはずです。

また、sircapsalot は良い提案をしています。try {} finally {} を使用して、すべてが適切に破棄されるようにしてください。

于 2012-09-25T19:49:42.377 に答える
0

この関数内には例外処理がないため、例外が発生すると続行されないため、br.Close();関数を実行しないでください。

try { } finally { }閉じていることを確認するために使用する必要があります。

private void Openbtn_Click(object sender, EventArgs e)
{
    textBox1.Text = "";
    listView1.Items.Clear();
    OpenFileDialog ofd = new OpenFileDialog();
    ofd.Title = "Open GSMB File";
    ofd.Filter = "GSMB Files (*.gsmb)|*.gsmb|All Files (*.*)|*.*";
    if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)
    {
        try {
            MessageBox.Show("File opened Succesfully!", "Info", MessageBoxButtons.OK, MessageBoxIcon.Information);
            path = ofd.FileName;
            BinaryReader br = new BinaryReader(File.OpenRead(path), Encoding.Unicode);
            BinaryReader brs = new BinaryReader(File.OpenRead(path), Encoding.Unicode);
            brs.BaseStream.Position = 0x4;
            menuItem9.Text = brs.ReadInt32().ToString();
            if (menuItem9.Text == "3620")
            {
                num_pointers = 204;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "54662")
            {
                num_pointers = 2372;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "9560")
            {
                num_pointers = 88;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "1126")
            {
                num_pointers = 130;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "342")
            {
                num_pointers = 16;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "6232")
            {
                num_pointers = 467;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "75698")
            {
                num_pointers = 498;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "9914")
            {
                num_pointers = 110;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "128")
            {
                num_pointers = 4;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "5394")
            {
                num_pointers = 156;
                menuItem8.Text = num_pointers.ToString();
            }
            else if (menuItem9.Text == "12000")
            {
                num_pointers = 580;
                menuItem8.Text = num_pointers.ToString();
            }
            else 
            {
                MessageBox.Show("This is not a Pokémon Typing Adventure string file !", "ERROR", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return;
            }
            List<int> offsets = new List<int>();
            int startstr = 0x1C;
            br.BaseStream.Position = startstr;
            int startstrval = br.ReadInt32();
            for (int i = 4; i < (num_pointers * 4 + 1); i += 4)
            {
                br.BaseStream.Position = startstr + i;
                offsets.Add(br.ReadInt32() + startstrval);
            }
            Dictionary<int, string> values = new Dictionary<int, string>();
            for (int i = 0; i < offsets.Count; i++)
            {
                int currentOffset = offsets[i];

                int nextOffset = (i + 1) < offsets.Count ? offsets[i + 1] : (int)br.BaseStream.Length;

                int stringLength = (nextOffset - currentOffset - 1) / 2;

                br.BaseStream.Position = currentOffset;

                var chars = br.ReadChars(stringLength);
                values.Add(currentOffset, new String(chars));
            }
            foreach (int offset in offsets)
            {
                listView1.Items.Add(offset.ToString("X")).SubItems.Add(values[offset]);
             listView1.Items[offset].SubItems[1].Text.Replace(System.Environment.NewLine, "\n");
            }               
        }
        finally {
            br.Close();
            br = null;
        }
    }
    ofd.Dispose();
    ofd = null;
}
private void menuItem10_Click(object sender, EventArgs e)
    {
    BinaryWriter bw;
    try {
        bw = new BinaryWriter(File.OpenWrite(path));

        bw.BaseStream.Position = 0x20;
        int number_pointers = Convert.ToInt32(num_pointers);
        Encoding enc = Encoding.Unicode;

        bw.Write(number_pointers);

        int curr_pointer = 4 + number_pointers * 4;
        for (int i = 0; i < number_pointers; i++)
        {
            bw.Write(curr_pointer);
            curr_pointer += enc.GetByteCount(listView1.Items[i].SubItems[1].Text) + 2;
        }

        for (int i = 0; i < number_pointers; i++)
            bw.Write(enc.GetBytes(listView1.Items[i].SubItems[1].Text + '\0'));
    }
    finally {
        bw.Flush();
        bw.Close();
        bw = null;
    }
}

また、ロジックの最初に「ファイルが正常に開かれました」というメッセージボックスを表示する必要があるかどうかもわかりません。

于 2012-09-25T19:39:44.510 に答える