2013-10-14 4 views
0

Я пытаюсь автоматизировать процесс слияния с использованием C#, DataSet и OpenXML. У меня есть полный рабочий пример при запуске локально. Однако при публикации на нашем веб-сервере я получаю сообщение об ошибке «Отказано в доступе», несмотря на то, что он даже допускает полный доступ во всем мире.Доступ запрещен при попытке открыть скопированное слово doc с OpenXML

Вот код, что приводит к сообщению об ошибке:

 try 
     { 
      var strTemplateTestFile = strMergeBuildingLocation.Replace(".docx", "_Test.docx"); 

      // Don't continue if the template file name is not found 
      if (!File.Exists(strTemplateFileName)) 
       throw new Exception("TemplateFileName (" + strTemplateFileName + ") does not exist"); 

      foreach (var dr in dsData.Tables[0].Rows) 
      { 

        string strFileName; 

       if (doesDestinationExist(strMergeBuildingLocation)) 
       { 
        File.Copy(strTemplateFileName, strTemplateTestFile, true); 
        strFileName = strTemplateTestFile; 
       } 
       else 
       { 
        File.Copy(strTemplateFileName, strMergeBuildingLocation, true); 
        strFileName = strMergeBuildingLocation; 
       } 

       var pkg = Package.Open(strFileName, FileMode.Open, FileAccess.ReadWrite); 
       using (var docGenerated = WordprocessingDocument.Open(pkg)) 

Проблема падает в последней строке при попытке открыть docGenerated.

Сообщение об ошибке я получаю это:

Доступ к пути «DOCX путь» запрещен.

Файл копирует, как ожидалось, и может быть открыт и изменен вручную. В папках нет ничего, что ограничивало бы доступ к файлу. Есть ли у кого-нибудь мысли о том, что может быть проблемой?

+1

Отмечено ли оно как только для чтения? – tnw

+0

Я предлагаю вам использовать [Sysinternals Process Monitor] (http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx), чтобы определить точную точку, которая вызывает ошибку отказа в доступе. Это всегда помогает мне. – Luizgrs

+0

@tnw, он не помечен как только для чтения, нет. – stharp888

ответ

0

Я думаю, что проблема здесь в этой строке.

var pkg = Package.Open(strFileName, FileMode.Open, FileAccess.ReadWrite); 
      using (var docGenerated = WordprocessingDocument.Open(pkg)) 

Здесь вы пытаетесь открыть документ дважды.

Попробуйте это,

/* Open WordProcessing document package based on filename */ 
    //------------------------------------------------------------------------------------------------Start 
    public static WordprocessingDocument OpenPackage(WordprocessingDocument package, string inputFileName, bool editable) 
    { 
     bool copied = false; 
     while (!copied) 
     { 
      try 
      { 
       package = WordprocessingDocument.Open(inputFileName, editable); 
       copied = true; 
      } 
      catch (Exception e) 
      { 
       if (e is FileFormatException) 
       { 
        package = null; 
        break; 
       } 
       if (e is IOException) 
       { 
        copied = false; 
       } 
       if (e is ZipException) 
       { 
        package = null; 
        break; 
       } 
      } 
     } 

     return package; 
    } 

Это даст вам пакет WordprocessingDocument, если он существует и доступен. Если файл не существует, null будет возвращен. Если файл заблокирован, откроется пакет при выпуске файла. Надеюсь, это поможет.! Спасибо!

Смежные вопросы