title: Corrupted MS Word/Excel file after File.OpenWrite
body: <p>I am attempting to programatically update or create a MS Word or Excel file on a shared drive if the ContentLength does not match.  The file is originally stored in a Sharepoint Database.  I am able to do this successfully when the file is written to a local directory, however, when this is done to a file on a network drive, even though the file is rewritten, the content becomes corrupted and is unable to be opened properly.  </p>
  
  <p>I'm not sure if the issue lies in the <code>WriteFile()</code> and there is a better way to create or update an Excel/Word file using something other than <code>File.Write</code> and <code>file.OpenWrite</code></p>
  
  <p>My code is as follows:</p>
  
  <pre><code>public void UpsertSharepointFiles()
          {
              try
              {
  
  
  
    var spList = GetSharepointDirectories();
  
              var targetDir = @"\\111.111.0.11\c$\websites\XXX\FormLibrary";
  
              IntPtr token = IntPtr.Zero;
              bool valid = LogonUser("administrator",
                          "XXX",
                          "XXX",
                          (int)LogonType.NewCredentials,
                          (int)LogonProvider.WinNT50,
                          ref token);
  
              if (valid)
              {
  
                  using (WindowsImpersonationContext context = WindowsIdentity.Impersonate(token))
                  {
  
                      CloseHandle(token);
  
                      //var targetDir = Server.MapPath("~/TempCopy");
                      //var targetDir = @"\\\\222.222.2.22\c$\websites\XXX\FormLibrary";
                      var targetDirInfo = new DirectoryInfo(targetDir);
  
                      var dirs = targetDirInfo.GetDirectories("*.*", SearchOption.AllDirectories);
  
                      if (spList != null)
                      {
  
                          foreach (var spFile in spList)
                          {
                              if (spFile.Content != null)
                              {
                                  foreach (var dir in dirs)
                                  {
                                      var searchFile = dir.GetFiles(spFile.LeafName);
                                      var currDirName = dir.Name;
  
                                      if (currDirName == "ABBH")
                                      {
                                          currDirName = "ABB";
                                      }
  
                                      if (searchFile.Count() == 0) //Web Server - No, SP - Yes
                                      {
                                          CreateFileOnWebServer(currDirName, spFile, targetDir);
                                      }
                                      else // Web Server - Yes, SP - Yes
                                      {
                                          UpdateFileOnWebServer(searchFile, spFile, targetDir, currDirName);
                                      }
                                  }
  
                              }
                          }
  
                          foreach (var dir in dirs)
                          {
                              DeleteFilesOnWebServerNotInSharepointDb(dir, spList);
                          }
                      }
                  }
  
                  lblSuccessMessage.Text = "Forms Library in Website successfully synced with Sharepoint Forms Library!";
                  lblSuccessMessage.Visible = true;
              }
          }
          catch (Exception)
          {
              lblErrorMessage.Text = "Error occurred when syncing Forms Library in Website.  Please try again.";
              lblErrorMessage.Visible = true;
          }
  
      }
  
  private static void DeleteFilesOnWebServerNotInSharepointDb(DirectoryInfo dir, List&lt;SharepointVO&gt; spList)
          {
              var dirFileList = dir.GetFiles();
  
              var filesOnServerNotInSharepointDb = dirFileList.Where(w =&gt; spList.All(s =&gt; s.LeafName != w.Name));
              foreach (var file in filesOnServerNotInSharepointDb)
              {
                  var fInfo = new FileInfo(file.DirectoryName + @"\" + file.Name).ToString();
                  System.IO.File.Delete(fInfo);
              }
          }
  
          private static void UpdateFileOnWebServer(FileInfo[] searchFile, SharepointVO spFile, string targetDir,
              string currDirName)
          {
              if (searchFile[0].Directory.Name == spFile.Directory)
              {
                  // Replace file with Sharepoint file
                  if (spFile.ContentLength != searchFile[0].Length) //Checks only first file
                  {
                      WriteFile(currDirName, spFile, targetDir);
                  }
              }
          }
  
          private static void CreateFileOnWebServer(string currDirName, SharepointVO spFile, string targetDir)
          {
              if (currDirName == spFile.Directory)
              {
                  // Check if directory exists on server
                  if (Directory.Exists(targetDir + "/" + currDirName))
                  {
                      {
                          {
                              WriteFile(currDirName, spFile, targetDir);
                          }
                      }
                  }
                  else
                  {
                      Directory.CreateDirectory(targetDir + "/" + currDirName);
  
                      WriteFile(currDirName, spFile, targetDir);
                  }
              }
          }
  
          private static void WriteFile(string currDirName, SharepointVO spFile, string targetDir)
          {
              using (
                  Stream fs =
                      System.IO.File.OpenWrite(targetDir + "/" + currDirName + "/" + spFile.LeafName))
              {
                  fs.Write(spFile.Content, 0, spFile.Content.Length);
              }
          }
  
          [DllImport("advapi32.dll", SetLastError = true)]
          public static extern bool LogonUser(string lpszUsername, string lpszDomain, string lpszPassword, int dwLogonType, int dwLogonProvider, ref IntPtr phToken);
  
          [DllImport("kernel32.dll")]
          public static extern bool CloseHandle(IntPtr token);
  
          enum LogonType
          {
              Interactive = 2,
              Network = 3,
              Batch = 4,
              Service = 5,
              Unlock = 7,
              NetworkClearText = 8,
              NewCredentials = 9
          }
  
          enum LogonProvider
          {
              Default = 0,
              WinNT35 = 1,
              WinNT40 = 2,
              WinNT50 = 3
          }
  </code></pre>