Не удается получить доступ к закрытому файлу в ASP.Net (сохранение файлов в zip-файле) - PullRequest
0 голосов
/ 23 августа 2011

Я получил эту ошибку «Невозможно получить доступ к закрытому файлу», когда я сохраняю более одного файла в zip. Это код. Ошибка при zip.Save(NewZipPath);

internal static string UpdateZipFile(string PdfPath, string ZipPath, 
                    string NewZipPath, string docPath)
{
    try
    {
    using (ZipFile zip = ZipFile.Read(ZipPath))
    {
        FileStream fs = new FileStream(PdfPath, FileMode.Open, FileAccess.Read);

        DirectoryInfo Dir = new DirectoryInfo(docPath);

        FileInfo[] FileList = Dir.GetFiles("*.*", SearchOption.AllDirectories);

        foreach (FileInfo FI in FileList)
        {
        zip.AddEntry(FI.FullName, fs);
        }

        // Error at this line if more than one
        // files in above directory.
        zip.Save(NewZipPath);

        fs.Close();
        fs.Dispose();

        return "- ZIP Generated Successfully !";
    }
    }
    catch (Exception ex)
    {
    return ex.Message;
    }
}

Полное исключение

System.ObjectDisposedException: Cannot access a closed file.
   at System.IO.__Error.FileNotOpen()
   at System.IO.FileStream.get_Length()
   at Ionic.Zip.ZipEntry.SetInputAndFigureFileLength(Stream& input)
   at Ionic.Zip.ZipEntry._WriteEntryData(Stream s)
   at Ionic.Zip.ZipEntry._EmitOne(Stream outstream)
   at Ionic.Zip.ZipEntry.Write(Stream s)
   at Ionic.Zip.ZipFile.Save()
   at Ionic.Zip.ZipFile.Save(String fileName)
   at RideShare.Utility.UpdateZipFile(String PdfPath, 
String ZipPath, String NewZipPath, String docPath) in 

Спасибо.

Ответы [ 2 ]

0 голосов
/ 23 августа 2011

exception происходит потому, что AddEntry использует FileStram и после того, как оно завершено с FileStream, оно закрывает его автоматически .. поэтому оно закрывается в течение Save после первого файла ... когда есть это один файл, это нормально - но ваш код добавляет один и тот же FileStream fs для каждого файла ... не уверен, что это именно то, что вам действительно нужно ... Я думаю, вы захотите открыть один отдельный поток для каждого файла, который вы добавляете через AddEntry ...

измените свой код на:

foreach (FileInfo FI in FileList)
    {
    zip.AddFile(FI.FullName);
    }

ИЛИ замените цикл foreach на

zip.AddFiles((from FI in Dir.GetFiles("*.*", SearchOption.AllDirectories) select FI.FullName).ToArray());
0 голосов
/ 23 августа 2011

Я думаю, что здесь происходит то, что использование потока "FS" запутано. Вы можете потратить время, пытаясь распутать его, или вы можете использовать более простой метод «AddFiles»:

Поиск «Создать почтовый индекс, содержащий все файлы в папке». на

http://dotnetzip.codeplex.com/wikipage?title=CS-Examples&referringTitle=Examples

...