2009-11-28 26 views
20

Tôi có một XmlFileHelper lớp đơn giản như sau:C# XML.load() khóa tập tin trên đĩa lỗi gây

public class XmlFileHelper 
{ 
    #region Private Members 

    private XmlDocument xmlDoc = new XmlDocument(); 
    private string xmlFilePath; 

    #endregion 

    #region Constructor 

    public XmlFileHelper(string xmlFilePath) 
    { 
     this.xmlFilePath = xmlFilePath; 
     xmlDoc.Load(xmlFilePath); 
    } 

    #endregion 

    #region Public Methods 

    public XmlNode SelectSingleNode(string xPathQuery) 
    { 
     return xmlDoc.SelectSingleNode(xPathQuery); 
    } 

    public string GetAttributeValueByName(XmlNode node, string attributeName) 
    { 
     return node.Attributes.GetNamedItem(attributeName).Value; 
    } 

    #endregion 

    #region Public Properties 

    public string XmlFilePath 
    { 
     get 
     { 
      return xmlFilePath; 
     } 
    } 

    #endregion 
} 

Vấn đề là tôi nhận được lỗi sau trên tải:

System.IO.IOException: The process cannot access the file ''C:\CvarUAT\ReportWriterSettings.xml'' **because it is being used by another process** 

điều này xảy ra khi lớp này được sử dụng bởi hai trường hợp chạy của một thành phần chạy song song cả hai cố gắng tải tệp xml ở trên, đây là hành vi hợp pháp và được yêu cầu bởi ứng dụng.

Tôi chỉ muốn đọc trong đĩa xml một lần và giải phóng mọi tham chiếu đến tệp trên đĩa và sử dụng biểu diễn bộ nhớ từ điểm đó trở đi.

Tôi đã giả định tải hoạt động theo kiểu chỉ đọc và không cần khóa tệp, cách tốt nhất của tôi để đạt được kết quả mong muốn và giải quyết vấn đề này là gì?

Cảm ơn

Trả lời

20

nó phụ thuộc vào những gì bạn cần từ những tập tin,

Nếu bạn cần nó để được threasdsafe bạn sẽ cần phải impliment một mutex để khóa tải giữa ví dụ,

Nếu bạn không thực sự cần tải an toàn luồng (tức là tệp không bao giờ thay đổi), bạn có thể tải tệp đó qua luồng phim rồi tải XmlDocument từ dòng

  FileStream xmlFile = new FileStream(xmlFilePath, FileMode.Open, 
FileAccess.Read, FileShare.Read); 
      xmlDoc.Load(xmlFile); 
+0

Tôi đang cố gắng thực hiện điều này ngay bây giờ, cảm ơn – m3ntat

+0

Tuyệt vời điều này đã làm các trick! – m3ntat

-1

thử:

xml.Load(
     new StreamReader(
      new FileStream(
        path, 
        FileMode.Open, 
        FileAccess.Read, 
        FileShare.Read) 
      ) 
     ); 
0

Nếu tập tin không phải là quá lớn để đọc vào bộ nhớ tất cả cùng một lúc:

xml.Load(new MemoryStream(File.ReadAllBytes(path))); 
34

Bạn có thể làm điều này

using (Stream s = File.OpenRead(xmlFilePath)) 
{ 
    xmlDoc.Load(s); 
} 

thay vì

xmlDoc.Load(xmlFilePath); 
Các vấn đề liên quan