C# DotNetZip System.UnauthorizedAccessException:对路径的访问被拒绝

C# DotNetZip System.UnauthorizedAccessException:对路径的访问被拒绝,c#,dotnetzip,C#,Dotnetzip,我知道这里有一些关于DotNetZip中这个错误的问题,我已经尝试了所有的解决方案,但都失败了。我正在我的Win8.1笔记本上开发代码,没有问题,问题在部署到远程Win2008R2服务器后开始 以下是问题解决方法: public bool CreateZIP(string ListStep) { Logger logger = LogManager.GetLogger("Task:CreateZIP" + this.TaskGuid); using (ZipFile zip =

我知道这里有一些关于DotNetZip中这个错误的问题,我已经尝试了所有的解决方案,但都失败了。我正在我的Win8.1笔记本上开发代码,没有问题,问题在部署到远程Win2008R2服务器后开始

以下是问题解决方法:

public bool CreateZIP(string ListStep)
{
    Logger logger = LogManager.GetLogger("Task:CreateZIP" + this.TaskGuid);

    using (ZipFile zip = new ZipFile())
    {
        zip.AlternateEncoding = System.Text.Encoding.GetEncoding("cp866");
        zip.AlternateEncodingUsage = Ionic.Zip.ZipOption.Always;

        ...
        zip.AddFile(...) loop
        ...

        zip.MaxOutputSegmentSize = Properties.Settings.Default.ZIPSizeLimit * 1024 * 1024;

        string zipFolder = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), @"zip-tmp");
        string TaskZipFolder = Path.Combine(zipFolder, this.TaskGuid);

        try
        {
            if (!Directory.Exists(zipFolder)) Directory.CreateDirectory(zipFolder);
            if (!Directory.Exists(TaskZipFolder)) Directory.CreateDirectory(TaskZipFolder);

            zip.TempFileFolder = Path.GetTempPath();
            zip.Save(Path.Combine(TaskZipFolder, this.TaskGuid + @".zip"));
        }
        catch (Exception e)
        {
            logger.Fatal("Unable to save ZIP into ({0}): {1}", Path.Combine(TaskZipFolder, this.TaskGuid + @".zip"), e.ToString());
            throw;
        }
    }
    return true;
}
此代码在远程服务器上从域用户
gfo svc
C:\Courier\WD
目录运行。 每个对象实例都有自己的GUID,例如
e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55
因此
zipFolder
变量值是
C:\Courier\WD\zip tmp
TaskZipFolder
值是
C:\Courier\WD\zip tmp\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55

当此代码尝试运行时,它将失败,并出现此堆栈跟踪:

Unable to save ZIP into (C:\Courier\WD\zip-tmp\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55.zip): System.UnauthorizedAccessException: Access to the path is denied.
   at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
   at System.IO.__Error.WinIOError()
   at System.IO.File.InternalMove(String sourceFileName, String destFileName, Boolean checkHost)
   at Ionic.Zip.ZipSegmentedStream.TruncateBackward(UInt32 diskNumber, Int64 offset)
   at Ionic.Zip.ZipEntry.Write(Stream s)
   at Ionic.Zip.ZipFile.Save()
   at Ionic.Zip.ZipFile.Save(String fileName)
   at Worker.Task.CreateZIP(String ListStep) in Worker.cs:line 844
第844行包含以下代码:
zip.Save(Path.Combine(TaskZipFolder,this.TaskGuid+@.zip))

但是在
C:\Courier\WD\zip tmp\e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55
文件夹中,我可以看到文件
e1664582-1bbc-4a9f-a9fe-e7ce4a0a8a55.z01
,因此在失败之前保存了存档的第一部分


gfo svc
用户拥有
C:\Courier\WD
目录的所有权,如果该目录不存在,“我的代码”可以创建
zip tmp
目录,并在其中创建GUID命名的目录。因此,问题不在于Windows安全权限。 此远程服务器上的UAC已禁用

我会做错什么?我的环境可能有什么问题?我能做什么?

好的,原因如下: 此代码在同一主机上运行两次:第一次从cmd手动运行,第二次从Windows任务计划程序运行。
默认情况下,任务计划程序从C:\windows\system32启动任务,进程无法写入其中。但是我的代码试图写入相对于工作目录路径的目录,所以实际上它试图写入…\system32\tmp dir.

“所以问题不在Windows安全权限中。”消息中说不是这样。将测试用例简化为
文件。writealText(路径“”)
。这与拉链无关。;在服务器上使用procmon观察Windows内核返回的确切故障。它可能会说“访问被拒绝”之类的话。@usr
File.writealText()
工作正常,没有错误。在procmon中有一条ACCESS_DENIED消息,但我不明白它从何而来……那么,ACCESS_DENIED旁边的路径说明了什么?这是确切的zip文件路径吗?请注意,错误发生在运行
file.InternalMove
时。zip库移动了文件。可能目标访问被拒绝。@usr这是procmon关于拒绝访问消息的说法:
日期和时间:3/11/2014 4:40:41 PM事件类:文件系统操作:CreateFile结果:拒绝访问路径:C:\Windows\SysWOW64 TID:3388持续时间:0.0000260所需访问:写入数据/添加文件,同步处置:打开选项:属性:不适用共享模式:读、写分配大小:不适用