আমি কোন তৃতীয় পক্ষের API ব্যবহার করে সি # তে একটি ফাইল জিপ করব কীভাবে?


175

আমি নিশ্চিত যে এটি কোনও সদৃশ নয় তাই আমার সাথে এক মিনিটের জন্য সহ্য করুন।

কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে আমি কীভাবে প্রোগ্রামক্রমে (সি #) একটি ফাইল জিপ করব (উইন্ডোজে)? আমার একটি নেটিভ উইন্ডোজ কল বা এর মতো কিছু দরকার; আমি একটি প্রক্রিয়া শুরু করার ধারণাটি সত্যিই অপছন্দ করি, তবে আমি যদি একেবারে করতে পারি তবে তা করব। একটি পিনোভেকে কল আরও ভাল হবে।

এটি ব্যর্থ হয়ে, আমি আপনাকে সত্যিই কী সম্পাদন করতে চাইছি তা বলি: আমার একক অনুরোধে কোনও ব্যবহারকারীকে নথিপত্রের সংগ্রহ ডাউনলোড করতে দেওয়া দরকার need কোন ধারনা কিভাবে এই কাজ করা সম্ভব?



1
@ চেসো: হ্যাঁ, একটি এএসপিএক্স পৃষ্ঠা থেকে।
এস্তেবান আরায়া

1
আমি এই উদাহরণটি ব্যবহারকারীরূপে পেয়েছি যখন আমি কয়েক সপ্তাহ আগে একই জিনিসটি অনুসন্ধান করতে গিয়েছিলাম: সিনট্যাক্সওয়ারিওরস ডটকম
জেনসবি

2
যদি 4.5 ফ্রেমওয়ার্ক ব্যবহার করা হয় তবে এখন জিপআর্কাইভ এবং জিপফিল ক্লাস রয়েছে।
গ্যালাকটিক

কেউ ডটনেটজিপ ব্যবহার করেছেন ??
হট লিকস

উত্তর:


85

আপনি .NET 3.5 ব্যবহার করছেন? আপনি ZipPackageক্লাস এবং সম্পর্কিত ক্লাস ব্যবহার করতে পারেন । এটি কেবলমাত্র একটি ফাইল তালিকা জিপ করা ছাড়াও আরও বেশি কারণ এটি আপনার যুক্ত প্রতিটি ফাইলের জন্য মাইম টাইম চায়। এটি আপনি যা চান তা করতে পারে।

ডাউনলোডের জন্য একাধিক সম্পর্কিত ফাইল সংরক্ষণাগারভুক্ত করার জন্য আমি বর্তমানে এই শ্রেণিগুলি একই ধরণের সমস্যার জন্য ব্যবহার করছি। আমরা আমাদের ডেস্কটপ অ্যাপের সাথে ডাউনলোড ফাইলটি সংযুক্ত করতে একটি ফাইল এক্সটেনশন ব্যবহার করি। একটি ছোট সমস্যা যার মধ্যে আমরা পড়েছিলাম তা হ'ল জিপ ফাইলগুলি তৈরি করতে কেবল 7-জিপের মতো একটি তৃতীয় পক্ষের সরঞ্জাম ব্যবহার করা সম্ভব নয় কারণ ক্লায়েন্টের সাইড কোডটি এটি খুলতে পারে না - জিপপ্যাকেজ একটি সামগ্রীর সামগ্রীর ধরণের বর্ণনা দিয়ে একটি লুকানো ফাইল যুক্ত করে প্রতিটি উপাদান ফাইল এবং যদি কোনও সামগ্রীর ধরণের ফাইলটি অনুপস্থিত থাকে তবে একটি জিপ ফাইল খুলতে পারে না।


1
ওহ, আমি আপনাকে কিভাবে ভালবাসি! ধন্যবাদ ব্রায়ান; আপনি কেবল আমাদের প্রচুর মাথাব্যাথা এবং কিছু বাঁচিয়েছেন $$$
এস্তেবান আরায়া

6
মনে রাখবেন যে এটি সর্বদা বিপরীতে কাজ করে না। কিছু জিপ ফাইলগুলি জিপপ্যাকেজ ক্লাস ব্যবহার করে পুনরায় হাইড্রেট করবে না। জিপপ্যাকেজ দিয়ে তৈরি ফাইলগুলি আপনার ভাল হওয়া উচিত।
ক্রেগ

নোট করুন যে জিপপ্যাকেজ বিদ্যমান জিপ করা প্যাকেজটিতে যুক্ত হতে পারে না।
gamegaMan

দীর্ঘশ্বাস ফেলা: "টাইপ বা নামস্থান" প্যাকেজিং System.IO "" নামস্থান বিদ্যমান নেই "।
হট licks

2
(উপরের "দীর্ঘশ্বাস" এর উত্তর: "রেফারেন্সগুলি" খুলুন এবং যুক্ত করুন (অযৌক্তিকভাবে যথেষ্ট) "উইন্ডোজবেস"))
হট লিকস

307

কোনও তৃতীয় পক্ষের লাইব্রেরি ব্যবহার না করে আমি কীভাবে প্রোগ্রামক্রমে (সি #) একটি ফাইল জিপ করব (উইন্ডোজে)?

যদি 4.5+ ফ্রেমওয়ার্ক ব্যবহার করা হয় তবে এখন জিপআর্কাইভ এবং জিপফাইলে ক্লাস রয়েছে।

using (ZipArchive zip = ZipFile.Open("test.zip", ZipArchiveMode.Create))
{
    zip.CreateEntryFromFile(@"c:\something.txt", "data/path/something.txt");
}

আপনাকে এখানে উল্লেখগুলি যুক্ত করতে হবে:

  • System.IO.Compression
  • System.IO.Compression.FileSystem

নেট নেট টার্গেটিং নেট 46 এর জন্য আপনাকে এর জন্য নির্ভরতা যুক্ত করতে হবে

  • System.IO.Compression
  • System.IO.Compression.ZipFile

প্রকল্পের উদাহরণ.জসন:

"dependencies": {
  "System.IO.Compression": "4.1.0",
  "System.IO.Compression.ZipFile": "4.0.1"
},

"frameworks": {
  "net46": {}
}

.NET কোর 2.0 এর জন্য, কেবলমাত্র একটি সাধারণ ব্যবহারের বিবৃতি যুক্ত করা যা যা প্রয়োজন তা হল:

  • System.IO.Compression ব্যবহার করে;

4
এটি কীভাবে আরও উপার্জন অর্জন করতে পারে নি? এটি একমাত্র প্রত্যক্ষ উত্তর।
ম্যাট ক্যাস্যাট 8'14

12
কারণ প্রশ্নটি পাঁচ বছরের পুরনো, যেখানে এই উত্তরটি মাত্র দু'মাস পুরানো। Derp :-P
হেলিয়াক

3
@ হেলিয়াক এখনও স্ট্যাকওভারফ্লো জিনিসটি একটি প্রশ্ন এবং উত্তর সংগ্রহস্থল হওয়া উচিত এবং চেতনায় সর্বোত্তম উত্তরটি উচ্চতর হতে হবে ... (জঘন্য, আমি জানতাম যে এটি কাজ করে না)
অফার

5
এটি যদি কাউকে সহায়তা করে তবে দ্বিতীয় যুক্তিটি হ'ল ফাইল এন্ট্রি। আনজিপ ফোল্ডারটির তুলনায় ফাইলটি বের করা হবে This উইন্ডোজ In-তে, আমি খুঁজে পেয়েছি যে যদি ফাইল এন্ট্রি একটি পুরো পথ হয়, যেমন, @ "ডি: \ টেম্পের \ file1.pdf", স্থানীয় উইন্ডোজ এক্সট্র্যাক্টর ব্যর্থ হয়। আপনি যদি Direct.GetFiles () থেকে প্রাপ্ত ফাইলের নামগুলি কেবল ব্যবহার করেন তবে আপনি এই সমস্যাটিতে চলে যেতে পারেন। ফাইল এন্ট্রি আর্গুমেন্টের জন্য Path.GetFileName () ব্যবহার করে ফাইলের নাম উত্তোলন করা সেরা।
মণীশ

2
আমি 4.5.2 এ এটি খুঁজে পেতে সক্ষম হবে বলে মনে হচ্ছে না?
ব্যবহারকারী 3791372

11

আমি একই পরিস্থিতিতে ছিলাম, তৃতীয় পক্ষের লাইব্রেরির পরিবর্তে .NET চাইছিলাম। উপরে উল্লিখিত অন্য পোস্টার হিসাবে, কেবল জিপপ্যাকেজ ক্লাস ব্যবহার করা (.NET 3.5 তে প্রবর্তিত) যথেষ্ট পর্যাপ্ত নয়। জিপপ্যাকেজটি কাজ করার জন্য একটি অতিরিক্ত ফাইল রয়েছে যা সংরক্ষণাগারে অন্তর্ভুক্ত করতে হবে। যদি এই ফাইলটি যুক্ত করা হয়, তবে ফলিত জিপ প্যাকেজটি সরাসরি উইন্ডোজ এক্সপ্লোরার থেকে খোলা যেতে পারে - কোনও সমস্যা নেই।

আপনাকে যা করতে হবে তা হ'ল আপনি যে বিষয়গুলি অন্তর্ভুক্ত করতে চান তার প্রতিটি ফাইল এক্সটেনশনের জন্য একটি "ডিফল্ট" নোড দিয়ে সংরক্ষণাগারের গোড়ায় [বিষয়বস্তু টাইপ] .xML ফাইল যুক্ত করতে হবে। একবার যুক্ত হয়ে গেলে, আমি উইন্ডোজ এক্সপ্লোরার থেকে প্যাকেজটি ব্রাউজ করতে পারি বা প্রোগ্রামগতভাবে এর সামগ্রীগুলি সঙ্কুচিত করতে এবং পড়তে পারি।

[বিষয়বস্তু টাইপস]। এক্সএমএল ফাইল সম্পর্কিত আরও তথ্য এখানে পাওয়া যাবে: http ://msdn.mic Microsoft.com/en-us/magazine/cc163372.aspx

এখানে [বিষয়বস্তু টাইপ] .xML (ঠিক নাম দেওয়া আবশ্যক) ফাইলের একটি নমুনা রয়েছে:

<?xml version="1.0" encoding="utf-8" ?>
<Types xmlns=
    "http://schemas.openxmlformats.org/package/2006/content-types">
  <Default Extension="xml" ContentType="text/xml" /> 
  <Default Extension="htm" ContentType="text/html" /> 
  <Default Extension="html" ContentType="text/html" /> 
  <Default Extension="rels" ContentType=
    "application/vnd.openxmlformats-package.relationships+xml" /> 
  <Default Extension="jpg" ContentType="image/jpeg" /> 
  <Default Extension="png" ContentType="image/png" /> 
  <Default Extension="css" ContentType="text/css" /> 
</Types>

এবং জিপ ফাইল তৈরির জন্য সি #

var zipFilePath = "c:\\myfile.zip"; 
var tempFolderPath = "c:\\unzipped"; 

    using (Package package = ZipPackage.Open(zipFilePath, FileMode.Open, FileAccess.Read)) 
    { 
        foreach (PackagePart part in package.GetParts()) 
        { 
            var target = Path.GetFullPath(Path.Combine(tempFolderPath, part.Uri.OriginalString.TrimStart('/'))); 
            var targetDir = target.Remove(target.LastIndexOf('\\')); 

            if (!Directory.Exists(targetDir)) 
                Directory.CreateDirectory(targetDir); 

            using (Stream source = part.GetStream(FileMode.Open, FileAccess.Read)) 
            { 
                source.CopyTo(File.OpenWrite(target)); 
            } 
        } 
    } 

বিঃদ্রঃ:


12
দুর্দান্ত নমুনা, তবে এটি কোনও জিপ ফাইল তৈরি করে না। এটি একটি বিদ্যমান ফাইল আনজিপ করে।
ম্যাট ভারব্লো

9
    private static string CompressFile(string sourceFileName)
    {
        using (ZipArchive archive = ZipFile.Open(Path.ChangeExtension(sourceFileName, ".zip"), ZipArchiveMode.Create))
        {
            archive.CreateEntryFromFile(sourceFileName, Path.GetFileName(sourceFileName));
        }
        return Path.ChangeExtension(sourceFileName, ".zip");
    }

এইচটিটিপি কনটেক্সট.কেনরত.রেকুইস্ট গ্রহণ করে কোনও ওয়েবপির ভিতরে থাকাকালীন আমি কীভাবে সোর্সফিলনাম পেতে পারি?
অলিভারটেক

আরও একটি ফাইল সংকোচনের?
কুইকিনেট

1

এই প্রশ্নের সায়মন ম্যাকেনজির উত্তরকে ভিত্তিতে আমি এই জাতীয় পদ্ধতিতে এক জোড়া ব্যবহার করার পরামর্শ দিচ্ছি:

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

0

উইন্ডোজ মত দেখায় শুধু আপনার না দেওয়া পারে এই ...

দুর্ভাগ্যক্রমে আমি মনে করি না আপনি তৃতীয় পক্ষের উপাদানটিতে না গেলে আপনি আলাদা প্রক্রিয়া শুরু করতে যাচ্ছেন।


0

আপনার প্রকল্পে এই 4 টি ফাংশন যুক্ত করুন:

        public const long BUFFER_SIZE = 4096;
    public static void AddFileToZip(string zipFilename, string fileToAdd)
    {
        using (Package zip = global::System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
        {
            string destFilename = ".\\" + Path.GetFileName(fileToAdd);
            Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
            if (zip.PartExists(uri))
            {
                zip.DeletePart(uri);
            }
            PackagePart part = zip.CreatePart(uri, "", CompressionOption.Normal);
            using (FileStream fileStream = new FileStream(fileToAdd, FileMode.Open, FileAccess.Read))
            {
                using (Stream dest = part.GetStream())
                {
                    CopyStream(fileStream, dest);
                }
            }
        }
    }
    public static void CopyStream(global::System.IO.FileStream inputStream, global::System.IO.Stream outputStream)
    {
        long bufferSize = inputStream.Length < BUFFER_SIZE ? inputStream.Length : BUFFER_SIZE;
        byte[] buffer = new byte[bufferSize];
        int bytesRead = 0;
        long bytesWritten = 0;
        while ((bytesRead = inputStream.Read(buffer, 0, buffer.Length)) != 0)
        {
            outputStream.Write(buffer, 0, bytesRead);
            bytesWritten += bytesRead;
        }
    }
    public static void RemoveFileFromZip(string zipFilename, string fileToRemove)
    {
        using (Package zip = global::System.IO.Packaging.Package.Open(zipFilename, FileMode.OpenOrCreate))
        {
            string destFilename = ".\\" + fileToRemove;
            Uri uri = PackUriHelper.CreatePartUri(new Uri(destFilename, UriKind.Relative));
            if (zip.PartExists(uri))
            {
                zip.DeletePart(uri);
            }
        }
    }
    public static void Remove_Content_Types_FromZip(string zipFileName)
    {
        string contents;
        using (ZipFile zipFile = new ZipFile(File.Open(zipFileName, FileMode.Open)))
        {
            /*
            ZipEntry startPartEntry = zipFile.GetEntry("[Content_Types].xml");
            using (StreamReader reader = new StreamReader(zipFile.GetInputStream(startPartEntry)))
            {
                contents = reader.ReadToEnd();
            }
            XElement contentTypes = XElement.Parse(contents);
            XNamespace xs = contentTypes.GetDefaultNamespace();
            XElement newDefExt = new XElement(xs + "Default", new XAttribute("Extension", "sab"), new XAttribute("ContentType", @"application/binary; modeler=Acis; version=18.0.2application/binary; modeler=Acis; version=18.0.2"));
            contentTypes.Add(newDefExt);
            contentTypes.Save("[Content_Types].xml");
            zipFile.BeginUpdate();
            zipFile.Add("[Content_Types].xml");
            zipFile.CommitUpdate();
            File.Delete("[Content_Types].xml");
            */
            zipFile.BeginUpdate();
            try
            {
                zipFile.Delete("[Content_Types].xml");
                zipFile.CommitUpdate();
            }
            catch{}
        }
    }

এবং তাদের এটি ব্যবহার করুন:

foreach (string f in UnitZipList)
{
    AddFileToZip(zipFile, f);
    System.IO.File.Delete(f);
}
Remove_Content_Types_FromZip(zipFile);
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.