मैं एक वेब इंस्टालर पर काम कर रहा हूं और मेरे पास वर्तमान में जो चीजें हैं उनमें से एक है

    void MoveFiles()
    {
        lbldlstatus.Text = "Moving Files";
        string InstallDirectory = Directory.GetCurrentDirectory() + "/DoxramosRepack-master";
        DirectoryInfo d = new DirectoryInfo(InstallDirectory);
        foreach(var file in d.GetFiles("*"))
        {
            try
            {
                if (File.Exists(file.Name)) {
                File.Delete(file.Name);
            }

                Directory.Move(file.FullName, file.Name);
                Cleanup();
            }
            catch(Exception e)
            {
                MessageBox.Show(e.ToString());
                lbldlstatus.Text = "Repack Installation Failed";
            }
        }            
    }
    void Cleanup()
    {
        lbldlstatus.Text = "Cleaning Up Files";
        try
        {
            if (File.Exists("Repack.zip"))
            {
                File.Delete("Repack.zip");
            }
            if(Directory.Exists("DoxramosRepack-master"))
            {
                Directory.Delete("DoxramosRepack-master");
            }
            lbldlstatus.Text = "Repack Installed Successfully";
        }

जब मैं Cleanup() पर पहुंचता हूं तो मेरे पास एक System.IO.IOException होता है।

प्रक्रिया Repack.zip फ़ाइल तक नहीं पहुंच सकती क्योंकि इसका उपयोग किसी अन्य प्रक्रिया द्वारा किया जा रहा है।

पूरा कोड चलता है

डाउनलोड करें-> एक्सट्रैक्ट-> मूव-> क्लीनअप।

मुझे यकीन नहीं है कि किस प्रक्रिया का उपयोग किया जा रहा है, लेकिन मैं प्रत्येक प्रक्रिया को शुरू करने से पहले पिछली प्रक्रिया को समाप्त करने की प्रतीक्षा करने का एक तरीका ढूंढ रहा हूं।

c#
0
Morgan Green 15 नवम्बर 2016, 02:37

2 जवाब

सबसे बढ़िया उत्तर

नीचे दिए गए कोड निकालने के अनुसार

void Extract()
{
    string zipPath = @"Repack.zip";
    string extractPath = @".";
    try
    {
        using (ZipFile unzip = ZipFile.Read(zipPath))
        {
            unzip.ExtractAll(extractPath);
            lbldlstatus.Text = "Extracting Files";
            MoveFiles();               
        }
    }
    catch (ZipException e)
    {
        MessageBox.Show(e.ToString());
        lbldlstatus.Text = "Repack Installation Failed";
    }
}

जिप फाइल को खत्म करने से पहले आप मूव फाइल्स को कॉल कर रहे हैं। यह देखते हुए कि चाल फ़ाइल विधि क्लीन अप फ़ंक्शन को कॉल करने के लिए ज़िम्मेदार है, तो आपको यह सुनिश्चित करना चाहिए कि ज़िप फ़ाइल को हटाने का प्रयास करने से पहले ही इसका निपटान किया जा चुका है।

void Extract()
{
    string zipPath = @"Repack.zip";
    string extractPath = @".";
    try
    {
        using (ZipFile unzip = ZipFile.Read(zipPath))
        {
            unzip.ExtractAll(extractPath);
            lbldlstatus.Text = "Extracting Files";
        }
        MoveFiles();
    }
    catch (ZipException e)
    {
        MessageBox.Show(e.ToString());
        lbldlstatus.Text = "Repack Installation Failed";
    }
}

सब कुछ ले जाने के बाद सफाई भी बुलाई जानी चाहिए। वर्तमान में उदाहरण कोड इसे लूप में बार-बार कॉल कर रहा है।

1
Nkosi 15 नवम्बर 2016, 03:43

आपने जो कोड पेस्टबिन पर चिपकाया है वह आपके द्वारा यहां पोस्ट किए गए कोड से अलग है। पेस्टबिन में कोड कभी भी सफाई नहीं कहता है।

वैसे भी समस्या इसलिए है क्योंकि आप यहां using ब्लॉक के भीतर से MoveFiles() को कॉल कर रहे हैं:

using (ZipFile unzip = ZipFile.Read(zipPath))
{
    unzip.ExtractAll(extractPath);
    lbldlstatus.Text = "Extracting Files";
    MoveFiles();       
}

इसे यूजिंग ब्लॉक के बाहर ले जाएं।

1
Nkosi 15 नवम्बर 2016, 04:20