1

Shell32 CopyHere メソッドに問題があります。

まず、このページから作業しています: http://www.codeproject.com/Tips/257193/Easily-zip-unzip-files-using-Windows-Shell32

VB.NET でほとんど作業したことがないという理由だけで、C# で似たようなものを書き直したいと思っていました。

テストとして、1 つのテキスト ファイルを含む入力ディレクトリ i を渡します。下部に、実際にファイルを取得していることを確認するために、input.Items() のカウントを書き込み、1 を取得したので、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# のいずれかが機能するかどうかを確認します。

みんな助けてくれてありがとう。

4

4 に答える 4

5

ここのコードは、codeproject ページの 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);

    }

}
于 2014-05-23T16:54:00.460 に答える
1

この質問に対する Simon McKenzie の回答に基づいて、次のような 2 つの方法を使用することをお勧めします。

    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);
    }
}
于 2014-10-08T11:38:08.520 に答える
0

.NET 4.5 を使用している場合は、System.IO.Compression.ZipFile. それははるかに簡単なはずです-そして、あなたが使っているものをよりよくテストしてください.

于 2014-05-23T16:57:48.977 に答える
0

なぜ独自の zip ツールを展開しているのですか?

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");
 }

解凍は、ほぼ同じレベルの複雑さです。

于 2014-05-23T16:59:39.483 に答える