Переименование файлов в процессе извлечения (Zip) ASP.Net

У меня есть RadUpload, который загружает только zip-файл, поэтому я хочу переименовать каждый файл во время процесса извлечения, я попробовал способ:

Protected Sub Upload(sender As Object, e As EventArgs)

    Dim extractPath As String = Server.MapPath("~/temp/")
    Dim file1 As String = RadUpload1.UploadedFiles(0).FileName

    ExtractFileToDirectory(file1, extractPath)

End Sub

Public Sub ExtractFileToDirectory(zipFileName As String, outputDirectory As String)

    Dim zip As ZipFile = ZipFile.Read(outputDirectory & zipFileName)
    Directory.CreateDirectory(outputDirectory)
    For Each e As ZipEntry In zip

        Dim NewName As String = Now().ToString("ddMMyyhhmmss")
        Dim newext As String = ".jpg"
        e.FileName = NewName + newext

        e.Extract(outputDirectory, ExtractExistingFileAction.OverwriteSilently)
    Next
End Sub

сначала он переименует и извлечет первый файл, но затем выдаст эту ошибку:

[Это было отрегулировано. Группа: Не удалось выполнить процесс переписи. ]

любая идея?

2 ответа

Решение

Кажется, есть проблема с outputDirectory

Dim zip As ZipFile = ZipFile.Read(outputDirectory & zipFileName)
Directory.CreateDirectory(outputDirectory)

В первой строке вы пытаетесь прочитать outputDirectory & zipFileNameво второй строке вы пытаетесь создать этот путь.

Смотрите MSDN, ваш код должен быть похож на

Using zip As ZipArchive = ZipFile.OpenRead(zipFileName)
   For Each e As ZipArchiveEntry In zip.Entries

     Dim NewName As String = Now().ToString("ddMMyyhhmmss")
     Dim newext As String = ".jpg"
     NewName += newext
     e.ExtractToFile(Path.Combine(outputDirectory, NewName ))

   Next
 End Using

ПРИМЕЧАНИЕ. Использование "ddMMyyhhmmss" в качестве имени файла вы, скорее всего, получите ошибку, если распаковка займет менее 1 секунды - либо добавьте мс, т.е. "ddMMyyhhmmssfff" или проверьте, не существует ли имя файла перед извлечением.

Поскольку вы ожидаете распаковать в временную папку, вам действительно следует использовать системную временную папку. Запись данных в ваше веб-приложение - плохая практика.

Используйте следующее, чтобы получить системную временную папку

Private Sub Upload(sender As Object, e As EventArgs)

Dim extractPath As String = System.IO.Path.GetTempPath() ' Better way to store temporary files
Dim file1 As String = RadUpload1.UploadedFiles(0).FileName

ExtractFileToDirectory(file1, extractPath)

End Sub

Затем внутри функции ExtractFileToDirectory вы создаете совершенно новую временную папку (используйте Guid.NewGuid ().ToString () для создания уникального имени папки) и распаковываете файлы, как описано в @2316116, используя метод ExtractToFile.

Такой подход избавляет вас от неприятных ошибок, возникающих при одновременной распаковке нескольких zip-файлов.

Другие вопросы по тегам