2014-01-10 32 views
1

我有一個C#文件上傳是爲了從DocX文檔中提取XML標籤,我面臨的問題是當文件上傳時,出現錯誤「文件正在被另一個進程使用」。試圖刪除文檔顯示它正在被IIS進程管理器使用。上傳表單無法正常工作 - 文件正在被其他進程使用

有沒有辦法阻止我的代碼讓它繼續運行?

<script runat="server"> 


//foreach (DataRow row in table.Rows) 
//{ 
    // string dbColumnNames = (selectedData.ToString()); 
    //send files 
//} 

    public string _TempFileLocation = ""; //Used to locate Word Document File Path 


     //THE USER UPLOAD CONTROL. users use this to upload the document to the server 
     public void XMLextractor(string _filePath) 
     { 
      //XML extraction code 
      displayFilepath.Text = _filePath; 
      _TempFileLocation = _filePath; 

     } 

     //names the script manager which will be used when the user attempts to upload a form/gives an error if they incorrectly attempt to upload 
     protected void UploadButton_Click(object sender, EventArgs e) 
     { 
      //if file is located 
      if (FileUploadControl.HasFile) 
      { 
       try 
       { 
        //allow content type of document/docx 
        if (FileUploadControl.PostedFile.ContentType == "application/vnd.openxmlformats-officedocument.wordprocessingml.document") 
        { 

         if (FileUploadControl.PostedFile.ContentLength < 10485760) // 10mb) 
         { 
          //name the filename, find the path of the name 
          string filename = Path.GetFileName(FileUploadControl.FileName); 
          //path of server upload (we just need to save it as a variable to be found on the next page, as it will be made/deleted 
          FileUploadControl.SaveAs(Server.MapPath("~/") + filename); 
          //update the label with file uploaded 
          StatusLabel.Text = "Upload status: File uploaded!"; 

          XMLextractor(Server.MapPath("~/") + filename); 

          //move onto template wizard page 
          //Response.Redirect("http://portal.acoura.com/admin/templatewizard.aspx", false); 

          WordprocessingDocument _TempDoc = WordprocessingDocument.Open(Server.MapPath("~/") + filename, true); 

          XDocument xdoc = XDocument.Load(Server.MapPath("~/") + filename); 
          //query to find particular descendants 
          var lv1s = from document in xdoc.Descendants("table") 
             select new 
             { 
              Header = document.Attribute("name").Value, 
              Children = document.Descendants("tag") 
             }; 

          //Loop through results 
          StringBuilder result = new StringBuilder(); 
          foreach (var lv1 in lv1s) 
             { 
              result.AppendLine(lv1.Header); 
              foreach (var lv2 in lv1.Children) 
              result.AppendLine("  " + lv2.Attribute("name").Value); 
             } 

          //the label should contain the content controls of the document, using the class, XMLfromDocument                                   
          labelContentControls.Text = fileUpload_Displayx(XMLfromDocument.GetContentControls(_TempDoc)); 
         } 

         else 
          //display the size the file needs to be less than 
          StatusLabel.Text = "Upload status: The file has to be less than 10mb!"; 
        } 
        else 
         //tell the user only docx files are accepted 
         StatusLabel.Text = "Upload status: Only DOCX files are accepted!"; 
       } 
       catch (Exception ex) 
       { 
        //display the exception message, in which case it would be either size/type/if it's present 
        StatusLabel.Text = "Upload status: The file could not be uploaded. The following error occured: " + ex.Message; 
       } 


      } 

     } 

     //needs to be replaced with the variable found in descendants/var tagContent 
     public string fileUpload_Displayx(XElement _contentcontrol) 
     { 
      string str = ""; 
      str = _contentcontrol.Name.ToString(); 

      return str; 
     } 


    //public static displayDatabase(object sender, EventArgs e) 
    // { 

    //} 
    //run the validate button on templatewizard, will mark up any problems or give green light 


    //if red, allow users to replace fields in the left column, from ones in the atabase on the right 


    //display upload button when validation is succesful. When Upload button runs, Take to new 
    ///existing page of reports, allow users to download this 






</script> 

回答

1

您正在打開該文件,而不關閉它在這條線:

WordprocessingDocument _TempDoc = WordprocessingDocument.Open(Server.MapPath("~/") + filename, true); 

則您與xDocument.Load()再次打開它:

XDocument xdoc = XDocument.Load(Server.MapPath("~/") + filename); 

我認爲是發生錯誤的地方。

如果你處理所有的東西XDocument需要先做,然後打開和關閉WordProcessingDocument.Open()行來獲取內容控件,你應該沒問題。

基本上只有一個進程可以一次打開並讀取或修改一個文件,所以如果需要執行來自兩個不同源的兩個操作,則它們必須在該文件上按順序執行。

您也可以通過FileStream打開文件,然後將內容加載到內存中並加載到您的XDocument中,因此無需同時打開文件兩次,即XDocumentWordProcessingDocument

希望這有助於!

相關問題