2012-09-25 28 views
-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:請不要張貼無用的評論和答案,如「在谷歌搜索」,「我們已經回答了這些類型的問題」,等等...... 我花了5個小時在谷歌尋找答案,沒有出現,但使用thed.close(),我搜索也在類似的問題,相同的答案,在stackoverflow網站,謝謝。

+2

第一次打開文件時會出現錯誤嗎?或只在後續時間? –

+0

你的代碼在哪裏出錯?它發生在menuItem10_Click或Openbtn_Click – iamkrillin

+0

你是否也試過關閉你的「brs」'BinaryReader'變量?我沒有看到它在第一種方法中被關閉。 –

回答

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; 
    } 
} 

我也不能肯定是否應該顯示一個MsgBox顯示「文件打開成功地」就在你的邏輯起點。

+0

謝謝你,你的方式也像魅力工作:D – Omarrrio

+0

很高興幫助:) – sircapsalot

1

可能的罪魁禍首是你自己的程序!

正如user287107所說,如果您處理該文件的句柄,您應該可以在以後再次打開它。

另外,sircapsalot有一個很好的建議:確保使用try {} finally {}正確處理所有內容。

+0

你是對的,我忘了另一個binaryreader命令。 ty :) – Omarrrio

相關問題