DotNetZip System.UnauthorizedAccessException:拒绝访问路径

时间:2014-03-11 07:00:56

标签: c# dotnetzip

我知道这里有关于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-tmpTaskZipFolder值为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已禁用。

我该怎么办?我的环境可能有什么问题?我该怎么办?

1 个答案:

答案 0 :(得分:1)

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