我遇到了Shell32 CopyHere方法的一些问题。
首先,我在这个页面上工作:http://www.codeproject.com/Tips/257193/Easily-zip-unzip-files-using-Windows-Shell32
我希望在C#中重写一些类似的内容,因为我几乎没有在VB.NET中工作过。
我正在传递一个输入目录,其中包含一个文本文件作为我的测试。在底部,只是让我看到它实际上抓住我的文件,我写了input.Items()的计数,我得到1,所以我认为它看到我的目录中有一个文本文件。但是,虽然我的代码创建了空的zip文件,但至少从该控制台输出看起来是抓取我的文件,它实际上并没有将任何内容复制到zip文件中。没有错误被抛出,就好像什么也没发生一样。
static void Zip(string i, string o)
{
//Turn relative paths into full paths for Shell.NameSpace method.
string ifp = Path.GetFullPath(i);
string ofp = Path.GetFullPath(o);
//Validate parameters.
if (!(Directory.Exists(ifp)) || (Directory.GetFiles(ifp).Count() <= 0))
throw new Exception("Input directory " + i + " was invalid. " + i + " was either empty or doesn't exist.");
string ext = ofp.Substring(ofp.Length - 4, 4);
if (ext != ".zip")
throw new Exception("Output zip directory " + o + " was invalid. File extension was " + ext + " when it should be .zip.");
if (File.Exists(ofp))
throw new Exception("Output zip directory " + o + " was invalid. Zip file already exists.");
//The following data represents an empty zip file.
byte[] startBuffer = { 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
//Create empty zip file.
File.WriteAllBytes(ofp, startBuffer);
if (!File.Exists(ofp))
throw new Exception("Output zip directory " + o + " was unable to be created.");
Shell sc = new Shell();
//Folder which contains the files you want to zip.
Folder input = sc.NameSpace(ifp);
//Empty zip file as folder.
Folder output = sc.NameSpace(ofp);
//Copy the files into the empty zip file.
output.CopyHere(input.Items(), 4);
Console.WriteLine(input.Items().Count);
}
我是如何使用Shell32方法的?
编辑:
对于响应缓慢感到抱歉,我正在尝试使用DJ Kraze提供的一些代码。
为了澄清一些事情,遗憾的是我不能使用第三方工具而且我在.NET 4.0上。我将尝试接受DJ的建议,看看我是否可以使用VB版本或者他亲切发布的C#。
感谢大家的帮助。
答案 0 :(得分:4)
这里的代码将是与代码项目页面
中的VB.NET代码等效的C#using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;
public class Form1
{
public void Zip()
{
//1) Lets create an empty Zip File .
//The following data represents an empty zip file .
byte[] startBuffer = {
80,
75,
5,
6,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0,
0
};
// Data for an empty zip file .
FileIO.FileSystem.WriteAllBytes("d:\\empty.zip", startBuffer, false);
//We have successfully made the empty zip file .
//2) Use the Shell32 to zip your files .
// Declare new shell class
Shell32.Shell sc = new Shell32.Shell();
//Declare the folder which contains the files you want to zip .
Shell32.Folder input = sc.NameSpace("D:\\neededFiles");
//Declare your created empty zip file as folder .
Shell32.Folder output = sc.NameSpace("D:\\empty.zip");
//Copy the files into the empty zip file using the CopyHere command .
output.CopyHere(input.Items, 4);
}
public void UnZip()
{
Shell32.Shell sc = new Shell32.Shell();
//'UPDATE !!
//Create directory in which you will unzip your files .
IO.Directory.CreateDirectory("D:\\extractedFiles");
//Declare the folder where the files will be extracted
Shell32.Folder output = sc.NameSpace("D:\\extractedFiles");
//Declare your input zip file as folder .
Shell32.Folder input = sc.NameSpace("d:\\myzip.zip");
//Extract the files from the zip file using the CopyHere command .
output.CopyHere(input.Items, 4);
}
}
答案 1 :(得分:0)
如果您使用的是.NET 4.5,则System.IO.Compression.ZipFile
。这应该更容易 - 并且更好地测试你正在使用的东西。
答案 2 :(得分:0)
为什么要推出自己的拉链工具?
只需使用DotNetZip即可。自由,快速,简单。参见
创建zip存档可以像
一样简单using (ZipFile zip = new ZipFile())
{
// add this map file into the "images" directory in the zip archive
zip.AddFile( @"c:\images\personal\7440-N49th.png", "images");
// add the report into a different directory in the archive
zip.AddFile( "c:\Reports\2008-Regional-Sales-Report.pdf" , "files" ) ;
zip.AddFile( "ReadMe.txt");
zip.Save("c:MyZipFile.zip");
}
解压缩的复杂程度大致相同。
答案 3 :(得分:0)
根据Simon McKenzie的回答to this question,我建议使用这样的一对方法:
public static void ZipFolder(string sourceFolder, string zipFile)
{
if (!System.IO.Directory.Exists(sourceFolder))
throw new ArgumentException("sourceDirectory");
byte[] zipHeader = new byte[] { 80, 75, 5, 6, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
using (System.IO.FileStream fs = System.IO.File.Create(zipFile))
{
fs.Write(zipHeader, 0, zipHeader.Length);
}
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
dynamic source = shellApplication.NameSpace(sourceFolder);
dynamic destination = shellApplication.NameSpace(zipFile);
destination.CopyHere(source.Items(), 20);
}
public static void UnzipFile(string zipFile, string targetFolder)
{
if (!System.IO.Directory.Exists(targetFolder))
System.IO.Directory.CreateDirectory(targetFolder);
dynamic shellApplication = Activator.CreateInstance(Type.GetTypeFromProgID("Shell.Application"));
dynamic compressedFolderContents = shellApplication.NameSpace(zipFile).Items;
dynamic destinationFolder = shellApplication.NameSpace(targetFolder);
destinationFolder.CopyHere(compressedFolderContents);
}
}