Pertanyaan Mencegah korupsi file saat menyimpan file xml


Baris berikutnya kadang-kadang merusak file xml dan membuat xml panjang nol, ketika OutOfMemoryException telah dilemparkan. Bagaimana cara mencegah korupsi file?

xmlDoc.Save(filename)

Save-Exception of type 'System.OutOfMemoryException' dilemparkan.   Save-at System.IO.FileStream.Write (Byte [] array, offset Int32, Int32   count) di System.IO.StreamWriter.Flush (Boolean flushStream, Boolean   flushEncoder) di System.IO.StreamWriter.Write (nilai Char) di   System.Xml.XmlTextWriter.Indent (Boolean beforeEndElement) di   System.Xml.XmlTextWriter.AutoComplete (Token token) di   System.Xml.XmlTextWriter.WriteStartElement (Prefix string, String   localName, String ns) di   System.Xml.XmlDOMTextWriter.WriteStartElement (Prefix string, String   localName, String ns) di System.Xml.XmlElement.WriteTo (XmlWriter w)   di System.Xml.XmlElement.WriteContentTo (XmlWriter w) di   System.Xml.XmlElement.WriteTo (XmlWriter w) di   System.Xml.XmlDocument.WriteContentTo (XmlWriter xw) di   System.Xml.XmlDocument.WriteTo (XmlWriter w) di   System.Xml.XmlDocument.Save (String filename) di   MainOptions.Save (String filename, opsi ItemOptions)


4
2017-12-29 09:04


asal


Jawaban:


Anda menimpa file saat Anda menyimpannya filename. Untuk mencadangkan salinan lama,

  • memindahkannya ke lokasi lain (seperti filename.bak) sebelum menyimpan dan hapus setelahnya atau
  • simpan file baru sebagai file lain (seperti filename.new) dan ganti namanya menjadi sukses

Ketika pengecualian dibuang, Anda dapat dengan mudah mengembalikan versi file xml yang lama / sebelumnya.


6
2017-12-29 09:08



Setuju dengan Matten. Solusi alternatif dapat menghasilkan string xml sebelum menyimpannya ke file:

Using ms As New MemoryStream
    xmlDoc.Save(ms)
    Using outStream As FileStream = File.Open(filename,
                 FileMode.Create, FileAccess.Write, FileShare.Read)
        ms.WriteTo(outStream)
    End Using
End Using

Gunakan aliran untuk mencocokkan xmlDoc.Save (nama file)


2
2017-12-29 16:56



OutOfMemory Exception

Pengecualian ini dapat dilemparkan oleh runtime bahasa umum ketika tidak ada cukup memori untuk mengalokasikan untuk keperluan internal atau instance objek baru. Untuk menghindari pengecualian ini, hindari memprogram metode besar yang menghabiskan 64 atau lebih kilobyte memori.

Jadi satu alasan yang mungkin bisa menjadi metode di mana Anda menyimpan Dokumen XML Anda sedang mencoba mengalokasikan lebih dari 64KB.

Untuk menghindari korupsi, jawaban 'Matten' cukup bagus dan Jon skeet menyarankan hal yang sama sini.

Tapi saya ingin menambahkan pemeriksaan keamanan lebih lanjut dengan menggunakan kunci saat melakukan operasi ini

  private static readonly object locker = new object();

  public static void OnlyOneCallerAllowed()
  {
    lock (locker)
    {
     string tempFileName = System.IO.Path.GetTempFileName();
     xmlDoc.Save(tempFileName);
     File.Move(original_file, original_file.old);
     File.Move(tempFileName,original_file);
     File.Delete( tempFileName);
    }
  }

1
2017-12-29 09:36



Mengatasi pengecualian OutOfMemory ...

Jika dokumen Anda besar dan memiliki elemen turunan yang memiliki beberapa level, maka indentasi dapat membengkak ukuran file. Saya telah menemukan bahwa XmlDocument dengan XmlTextWriter mengindent menggunakan spasi. Saya sudah

Lihat: http://msdn.microsoft.com/en-us/library/system.xml.xmltextwriter.formatting%28v=vs.71%29.aspx

Coba nonaktifkan semua indenting dan lihat apakah ini membantu. Jika itu mempertimbangkan 1 karakter indentasi dan restrukturisasi file.


0
2017-12-29 10:29