我是编程新手,请耐心等待。
我目前正在开发Visual C#2010 Express,.NET Framework 4.0中的一个小程序,该程序在Linux机器上启动脚本(创建文件/tmp/logs.tgz),下载文件然后我想要提取它。运行脚本并通过Renci.SshNet下载文件完美无瑕。 但是当我想要提取它时,它会给我一个错误“NotSupportedException”我的文件路径格式不正确(我认为不是这种情况?)。 我直接从here复制并粘贴代码(从TGZ(.tar.gz)简单完整摘录)并根据我的需要对其进行编辑:
using System.IO;
using System.IO.Compression;
using ICSharpCode.SharpZipLib.GZip;
using ICSharpCode.SharpZipLib.Tar;
//it executed the Script and created the file on the Linux Machine /tmp/logs.tgz
//now I want to download it
string myTime = DateTime.Now.ToString("yyyyMMdd");
var pathWithEnv = (@"%USERPROFILE%\Desktop\logs" + myTime + ".tgz");
var filePath = Environment.ExpandEnvironmentVariables(pathWithEnv);
string localFile = filePath;
//then downloads /tmp/logs.tgz to ..\Desktop\logs+ myTime +.tgz
//everything great until now. here I want to extract .TGZ:
var pathWithEnv2 = (@"%USERPROFILE%\Desktop\logs" + myTime);
var fileDir = Environment.ExpandEnvironmentVariables(pathWithEnv2);
string localDir = fileDir;
Stream inStream = File.OpenRead(localFile);
Stream gzipStream = new GZipInputStream(inStream);
TarArchive tarArchive = TarArchive.CreateInputTarArchive(gzipStream);
//ERROR OCCURS HERE:
tarArchive.ExtractContents(localDir);
tarArchive.Close();
gzipStream.Close();
inStream.Close();
我甚至尝试在没有EnviromentVariable的情况下设置localFile和localDir字符串,但这没有用。我试过了: - 直接下载并在C:\(或映射的网络驱动器U :)上解压缩,以防止文件名太长(不应该是这种情况,因为它永远不会超过86个字符)。 - string = @“C:.. \ logs”,string =“C:\ .. \ logs”,string = @“C:.. \ logs \”等。 - 尝试没有myTime - 使用ICSharpCode.SharpZipLib.Core;
我做了一个MessageBox.Show(localDir);在tarArchive.ExtractContents(localDir)之前;它显示“C:\ Users \ Baumann \ Desktop \ logs20140530”这是正确的,这就是我要将其提取到的目录。即使在执行目录之前创建目录也无济于事。
我还创建了一个只有一个按钮的新项目,该按钮应该启动提取并发生相同的错误。
我试过,单独做,首先提取GZip然后提取.tar,但是在提取GZip时它也给了我相同的错误(使用ICSharpCode.SharpZipLib.Core;当然)。
让我更加疯狂的是,它在它失败之前开始提取它,但不是一切。并且始终是相同的文件,我不明白为什么这些以及为什么不是其他文件。
我在Windows 8.1上,使用SharpZipLib 0.86.0.518,直接从网站下载。
提前致谢。
答案 0 :(得分:0)