2012-02-17 32 views
9

Tôi có một C# chức năng đơn giản mà tạo ra một tập tin XML cơ bản và tiết kiệm:XmlDocument Lưu giữ tập tin mở

private void CreateXMlFile(string Filename, string Name, string Company) 
     { 
      XmlDocument doc = new XmlDocument(); 
      XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 
      doc.AppendChild(docNode); 

      XmlNode licenseNode = doc.CreateElement("license"); 
      doc.AppendChild(licenseNode); 

      XmlNode node = doc.CreateElement("Name"); 
      node.AppendChild(doc.CreateTextNode(Name)); 
      licenseNode.AppendChild(node); 

      node = doc.CreateElement("Company"); 
      node.AppendChild(doc.CreateTextNode(Company)); 
      licenseNode.AppendChild(node); 


      doc.Save(Filename); 
     } 

Khi tôi cố gắng để chỉnh sửa hoặc xóa các tập tin tôi luôn luôn nhận được lỗi sau:

The process cannot access the file because it is being used by another process.

XmlDocument không có bất kỳ việc định sẵn hoặc đóng thói quen sẵn có nào và tự hỏi làm thế nào tôi có thể buộc tệp phải đóng trước khi chỉnh sửa hoặc xóa nó sau này.

Tôi đã cố gắng để lưu các tập tin sử dụng StreamWriter:

StreamWriter outStream = System.IO.File.CreateText(outfile); 
      outStream.Write(data); 
      outStream.Close(); 

Nhưng điều này didnt tạo sự khác biệt với các lỗi tương tự.

Lời khuyên của bạn được chấp nhận rất nhiều.

Cảm ơn bạn

+0

Bạn đã cố gắng viết nó với một thể hiện của một dòng ghi thay vì chuyển tên tệp để lưu? – Steve

+0

Tôi đã có cùng một vấn đề, nhưng mã của tôi đã tải XML đầu tiên nếu nó tồn tại. Đối tượng 'XmlReader' cần được đóng trước khi khóa được giải phóng. –

Trả lời

1

Mã của bạn là tốt. Tôi đã thử nghiệm nó trên máy tính của tôi và không có khóa trái sau khi Save().

Hãy thử sử dụng Trình mở khóa (http://www.softpedia.com/get/System/System-Miscellaneous/Unlocker.shtml) để kiểm tra xem bạn có thực sự là người giữ khóa hay không.

Bạn sử dụng khung công tác .NET nào? Đó cũng là một báo cáo (http://bytes.com/topic/net/answers/467028-xmldocument-save-does-not-close-file-properly) cũng không thể tái tạo được.

+0

Nó đang bị khóa bởi vshost.exe. Tôi vừa biên dịch sang .net 3.5 và cùng một vấn đề. – Belliez

+0

Bạn có thể tạo một dự án trống với phương thức đó được gọi bằng một lần nhấp nút và kiểm tra sau khi nhấp vào liệu tệp có bị khóa không? – BlueM

4

Gửi luồng tới phương thức Lưu của XmlDocument thay vì tên tệp.

private static void Main(string[] args) 
    { 
     CreateXMlFile("c:\\test.xml", "testName", "testCompany"); 
    } 

    private static void CreateXMlFile(string Filename, string Name, string Company) 
    { 
     XmlDocument doc = new XmlDocument(); 
     XmlNode docNode = doc.CreateXmlDeclaration("1.0", "UTF-8", null); 
     doc.AppendChild(docNode); 

     XmlNode licenseNode = doc.CreateElement("license"); 
     doc.AppendChild(licenseNode); 

     XmlNode node = doc.CreateElement("Name"); 
     node.AppendChild(doc.CreateTextNode(Name)); 
     licenseNode.AppendChild(node); 

     node = doc.CreateElement("Company"); 
     node.AppendChild(doc.CreateTextNode(Company)); 
     licenseNode.AppendChild(node); 
     StreamWriter outStream = System.IO.File.CreateText(Filename); 

     doc.Save(outStream); 
     outStream.Close(); 
    } 

Tôi đã thử thực thi mã ở trên và nó hoạt động tốt ở cuối của tôi.

+0

Tôi đã thử điều này và khi tôi đi để xóa các tập tin tôi nhận được cùng một lỗi. – Belliez

+0

Bạn có thể thử thay đổi vị trí tệp không? – AshokD

+0

cũng đã thử vị trí mới và giống nhau. Tôi cũng vô hiệu hóa Livedrive (sao lưu trực tuyến) trong trường hợp điều này đã can thiệp. – Belliez

Các vấn đề liên quan