0

system.io.packaging.package を使用して、いくつかのファイルを含むパッケージを作成しています。目的は、インポート/エクスポート機能を作成することです。

私はそのようなパッケージを作成します:

        // Create the compressed file.
        using (FileStream outFile = File.Create(this.packageName))
        {
            using (Package Compress = Package.Open(outFile, FileMode.Create))
            {
                foreach (string file in Directory.GetFiles(Path.GetDirectoryName(this.packageName)))
                {
                    FileInfo fi = new FileInfo(file);

                    // Prevent compressing hidden and already compressed files.
                    if ((File.GetAttributes(fi.FullName) & FileAttributes.Hidden) != FileAttributes.Hidden & fi.Extension != ".gz")
                    {
                        PackagePart packagePartDocument;

                        if (fi.Extension == ".xml")
                        {
                            packagePartDocument = Compress.CreatePart(PackUriHelper.CreatePartUri(new Uri(@"/" + Path.GetFileName(file), UriKind.Relative)), System.Net.Mime.MediaTypeNames.Text.Xml);
                        }
                        else
                        {
                            packagePartDocument = Compress.CreatePart(PackUriHelper.CreatePartUri(new Uri(@"/" + Path.GetFileName(file), UriKind.Relative)), System.Net.Mime.MediaTypeNames.Text.Plain);
                        }

                        using (FileStream inFile = fi.OpenRead())
                        {
                            inFile.CopyTo(packagePartDocument.GetStream());
                        }

                        Compress.CreateRelationship(packagePartDocument.Uri, TargetMode.Internal, fi.FullName);
                    }
                }
            }
        }

そして私はそれを次のように読みました:

using (Package zip = Package.Open(PackageStream, FileMode.Open, FileAccess.Read, FileShare.None))
        {
            Directory.CreateDirectory(Path.Combine(App.Configuration.TempDirectory, this.packageName.Split('.')[0]));
            foreach (PackagePart file in zip.GetParts())
            {
                string fileName = Path.Combine(App.Configuration.TempDirectory, this.packageName.Split('.')[0], file.Uri.ToString().TrimStart('/'));
                using (FileStream fileStream = new FileStream(fileName, FileMode.Create))
                {
                    file.GetStream().CopyTo(fileStream);
                }
            }
        }

パッケージがファイルを開こうとすると問題が発生します

Package zip = Package.Open(PackageStream, FileMode.Open, FileAccess.Read, FileShare.None)

「ファイルに破損したデータが含まれています」というエラーが表示される

何度もテストしたのですが、よくわかりません...

EDIT : 同じコードがコンソール アプリケーションでは機能しますが、Web アプリケーションでは機能しません。

4

1 に答える 1

0

最後に私は自分の間違いを見つけました:

この生成されたパッケージを返すと、パッケージだけでなく Web ページ全体も返されます。

    Response.AddHeader("content-disposition", "attachment; filename=" + export.PackageName);
    Response.ContentType = "application/octet-stream";
    Response.WriteFile(export.PackageFullName);

だから私はそれを修正しました

    Response.Clear();
    Response.ClearHeaders();
    Response.ClearContent();
    Response.AddHeader("content-disposition", "attachment; filename=" + export.PackageName);
    Response.ContentType = "application/octet-stream";
    Response.WriteFile(export.PackageFullName);
    Response.Flush();
    Response.End();

できます :)

于 2013-07-25T11:58:56.470 に答える