C# file.OpenWrite之后的MS Word/Excel文件已损坏

C# file.OpenWrite之后的MS Word/Excel文件已损坏,c#,sharepoint,ms-office,file-writing,cross-server,C#,Sharepoint,Ms Office,File Writing,Cross Server,如果ContentLength不匹配,我试图通过编程方式在共享驱动器上更新或创建MS Word或Excel文件。该文件最初存储在Sharepoint数据库中。当文件被写入本地目录时,我能够成功地执行此操作,但是,当对网络驱动器上的文件执行此操作时,即使文件被重写,内容也会损坏,无法正确打开 我不确定问题是否出在WriteFile()中,是否有更好的方法使用file.Write和file.OpenWrite以外的其他内容创建或更新Excel/Word文件 我的代码如下: public void U

如果ContentLength不匹配,我试图通过编程方式在共享驱动器上更新或创建MS Word或Excel文件。该文件最初存储在Sharepoint数据库中。当文件被写入本地目录时,我能够成功地执行此操作,但是,当对网络驱动器上的文件执行此操作时,即使文件被重写,内容也会损坏,无法正确打开

我不确定问题是否出在
WriteFile()
中,是否有更好的方法使用
file.Write
file.OpenWrite
以外的其他内容创建或更新Excel/Word文件

我的代码如下:

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<SharepointVO> spList)
        {
            var dirFileList = dir.GetFiles();

            var filesOnServerNotInSharepointDb = dirFileList.Where(w => spList.All(s => 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
        }
public void UpsertSharepointFiles()
{
尝试
{
var spList=getSharePointDirectory();
var targetDir=@“\\111.111.0.11\c$\websites\XXX\FormLibrary”;
IntPtr令牌=IntPtr.Zero;
bool valid=LogonUser(“管理员”,
“XXX”,
“XXX”,
(int)LogonType.NewCredentials,
(int)LogonProvider.WinNT50,
参考标记);
如果(有效)
{
使用(WindowsImpersonationContext=WindowsIdentity.Impersonate(令牌))
{
闭合手柄(令牌);
//var targetDir=Server.MapPath(“~/TempCopy”);
//var targetDir=@“\\\\222.222.2.22\c$\websites\XXX\FormLibrary”;
var targetDirInfo=新目录信息(targetDir);
var dirs=targetDirInfo.GetDirectories(“**”,SearchOption.AllDirectories);
if(spList!=null)
{
foreach(spList中的spvar文件)
{
如果(spFile.Content!=null)
{
foreach(目录中的var dir)
{
var searchFile=dir.GetFiles(spFile.LeafName);
var currDirName=dir.Name;
if(currDirName==“ABBH”)
{
currDirName=“ABB”;
}
if(searchFile.Count()==0)//Web服务器-否,SP-是
{
CreateFileOnWebServer(currDirName、spFile、targetDir);
}
else//Web服务器-是,SP-是
{
UpdateFileOnWebServer(searchFile、spFile、targetDir、currDirName);
}
}
}
}
foreach(目录中的var dir)
{
DeleteFilesOnWebServerNotInSharepointDb(dir,spList);
}
}
}
lblSuccessMessage.Text=“网站中的表单库已成功与Sharepoint表单库同步!”;
lblSuccessMessage.Visible=true;
}
}
捕获(例外)
{
lblErrorMessage.Text=“在网站中同步表单库时出错。请重试。”;
lblErrorMessage.Visible=true;
}
}
私有静态void DeleteFilesOnWebServerNotInSharepointDb(目录信息目录,列表列表)
{
var dirFileList=dir.GetFiles();
var filesOnServerNotInSharepointDb=dirFileList.Where(w=>spList.All(s=>s.LeafName!=w.Name));
foreach(filesOnServerNotInSharepointDb中的var文件)
{
var fInfo=new FileInfo(file.DirectoryName+@“\”+file.Name).ToString();
System.IO.File.Delete(fInfo);
}
}
私有静态void UpdateFileOnWebServer(FileInfo[]搜索文件,SharepointVO spFile,字符串targetDir,
字符串(名称)
{
if(searchFile[0].Directory.Name==spFile.Directory)
{
//将文件替换为Sharepoint文件
if(spFile.ContentLength!=searchFile[0].Length)//只检查第一个文件
{
WriteFile(currDirName、spFile、targetDir);
}
}
}
私有静态void CreateFileOnWebServer(字符串currDirName、SharepointVO spFile、字符串targetDir)
{
if(currDirName==spFile.Directory)
{
//检查服务器上是否存在目录
if(Directory.Exists(targetDir+“/”+currDirName))
{
{
{
WriteFile(currDirName、spFile、targetDir);
}
}
}
其他的
{
Directory.CreateDirectory(targetDir+“/”+currDirName);
WriteFile(currDirName、spFile、targetDir);
}
}
}
私有静态void WriteFile(字符串currDirName、SharepointVO spFile、字符串targetDir)
{
使用(
流fs=
System.IO.File.OpenWrite(targetDir+“/”+currDirName+“/”+spFile.LeafName))
{
写入(spFile.Content,0,spFile.Content.Length);
}
}
[DllImport(“advapi32.dll”,SetLastError=true)]
公共静态外部bool LogonUser(字符串lpszUsername、字符串lpszDomain、字符串lpszPassword、int-dwLogonType、int-dwLogonProvider、ref-IntPtr phToken);
[DllImport(“kernel32.dll”)]