2012-02-20 2 views
1

Мне нужно разархивировать файл, который находится в базовом каталоге, например sample.zip. Я сделал образец приложения для этого. У меня есть 1 входной параметр - каталог назначения. Вот примеры кода:Ошибка аргумента разворачивания zip-файла с помощью оболочки

private void BInstall_Click(object sender, EventArgs e) 
{ 
    string currentdir = Directory.GetCurrentDirectory();//Gets current directory 
    string zip = currentdir + "\\" + "sample.zip";//Path to zip file 
    string outPath = TBoutputPath.Text; 
    exctract(zip ,outPath); 
} 

А вот функция, которая должна извлечь файл почтового индекса:

void exctract(string name, string path) 
{ 
    string[] args = new string[2]; 
    if (name.IndexOf(" ") != -1) 
    { 
     //we got a space in the path so wrap it in double qoutes 
     args[0] += "\"" + name + "\""; 
    } 
    else 
    { 
     args[0] += name; 
    } 

    if (path.IndexOf(" ") != -1) 
    { 
     //we got a space in the path so wrap it in double qoutes 
     args[1] += " " + "\"" + path + "\""; 
    } 
    else 
    { 
     args[1] +=path; 
    } 

    Shell32.Shell sc = new Shell32.Shell(); 
    Shell32.Folder SrcFlder = sc.NameSpace(args[0]); 
    Shell32.Folder DestFlder = sc.NameSpace(args[1]); 
    Shell32.FolderItems items = SrcFlder.Items(); 
    DestFlder.CopyHere(items , 20); 
} 

В DestFlder.CopyHere(items , 20); я получаю NullReferenceException, и я не знаю, почему, так как объекты не должно быть нулевым. Это значение DestFlder равно null; кажется, что SrcFolder инициализирован, но DestFlder - нет. Единственное различие, которое я могу найти, заключается в том, что у DestFlder нет последующего расширения файла, но поскольку это папка, у него не должно быть ни одного.

Может ли кто-нибудь объяснить мне, что я сделал не так, и как это исправить?

+0

Можете ли вы использовать свой отладчик для определения того, какой объект (DestFlder, items) имеет значение null, если таковое имеется? И в то время как оболочка делает это для вас интересной проблемой, может быть проще использовать библиотеку unzip, например. SharpZipLib – Rup

+0

DestFlder показывает как null и дает мне сообщение об ошибке «Нет дополнительной информации об этом объекте». Хорошо 20 - это int, поэтому эта проблема должна быть проблемой: D – TheBW

+1

Посмотрите на свой код, в котором у вас есть + = "\" + "\\", в строке zip = currentdir + "\\" + ". zip "; // Путь к zip-файлу, возможно, вы добавляете дополнительную« \ »отладку и убедитесь, что то, что вы ищете, находится в следующей строке currentdir = Directory.GetCurrentDirectory(); // Возвращает текущий каталог string zip = currentdir + "\\" + "sample.zip"; // Путь к zip-файлу, возможно, у вас есть некоторые проблемы с Path. – MethodMan

ответ

1

Ответ на эту проблему был довольно ... тривиальным, но как и все простейшие проблемы, о которых почти невозможно думать.

Папка не существует, и на ней нельзя ссылаться. Этот кусок кода зафиксировано, что:

 if (!Directory.Exists(args[1])) 
      Directory.CreateDirectory(args[1]); 

Ты DJ Kraze сделал точку на другую проблему со сценарием, который может иметь это, возможно, получите ошибку во время выполнения в конце концов. Спасибо вам за это!