Переименование файлов в процессе извлечения (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-файлов.