Member 13855757 Ответов: 1

Я не могу удалить исходный файл растрового изображения даже после его удаления.


Я хочу изменить элемент свойства изображения, а затем изменить имя файла источника изображения на форму даты изображения. Когда я пытаюсь удалить исходное изображение после переименования копии, я получаю обычное сообщение: "доступ к пути 'H:\Photos\Test Folder\MBR_1.JPG-это отрицается." Общий ответ на эту проблему заключается в том, чтобы избавиться от образа. Я так и сделал, но я все еще получаю сообщение. Если код кажется вам смешным, то это потому, что так оно и есть VB.NET.

Что я уже пробовал:

Imports System.IO
Imports System.Drawing.Imaging

    Sub test(ByVal szFolder As String)
        Dim aszFiles() As String = Directory.GetFiles(szFolder)
        For intFile As Integer = aszFiles.Length - 1 To 0 Step -1
            Dim szOriginalFile As String = aszFiles(intFile)
            ' Determine if this file is a .jpg or .avi file
            Dim szExtension As String = LCase(Path.GetExtension(szOriginalFile))
            Select Case szExtension
                Case ".jpg", ".jpeg"
                    Try
                        Dim szFilePath As String = Path.GetDirectoryName(szOriginalFile)
                        If szFilePath = "" Then szFilePath = Path.GetPathRoot(szOriginalFile) ' If root path is selected.

                        If Microsoft.VisualBasic.Right(szFilePath, 1) <> "\" Then szFilePath &= "\"
                        Dim szTempBakFile As String = Path.GetDirectoryName(szOriginalFile) & "\" & _
                            Path.GetFileNameWithoutExtension(szOriginalFile) & ".bak"

                        If Microsoft.VisualBasic.Right(szFilePath, 1) <> "\" Then szFilePath &= "\"
                        Dim szNewFile As String = Path.GetDirectoryName(szOriginalFile) & "\" & _
                            "File" & intFile.ToString & ".jpeg"

                        If szNewFile <> szOriginalFile Then
                            Dim Image1 As Bitmap = New Bitmap(szOriginalFile) ' If file has no bitmap, Try-Catch goes to Next File
                            Image1.Save(szTempBakFile, ImageFormat.Jpeg) ' save Image1 as "old name.bak"
                            Image1.Dispose() ' Unlock file
                            File.Move(szTempBakFile, szNewFile) ' Rename image with new name
                            File.Delete(szOriginalFile) ' Delete file
                        End If
                    Catch ex As Exception
                        MsgBox(ex.ToString)
                    End Try
            End Select
        Next
    End Sub

1 Ответов

Рейтинг:
1

OriginalGriff

Если я извлеку из него код и настрою его для работы в моей системе, предварительно установив имена файлов:

Dim szOriginalFile As String = "D:\Temp\MyPic.jpg"
Dim szTempBakFile As String = "D:\Temp\MyPicTemp.jpg"
Dim szNewFile As String = "D:\Temp\MyPicNew.jpg"
Dim Image1 As Bitmap = New Bitmap(szOriginalFile)
Image1.Save(szTempBakFile, ImageFormat.Jpeg)
Image1.Dispose()
File.Move(szTempBakFile, szNewFile)
File.Delete(szOriginalFile)
Это прекрасно работает: я получаю один выходной файл под новым именем.
При условии, что я переименую файл обратно между запусками, он может сделать это столько раз, сколько нравится, не выходя из приложения.

Таким образом, это не тот код, который вызывает проблему - это либо подлинная проблема разрешений, либо что-то еще в вашем коде блокирует файл.

Кстати: это очень, очень плохая идея переименовывать JPG-файлы, загружая и записывая их: каждый раз, когда вы сохраняете JPG-изображение, вы теряете детали, потому что оно использует алгоритм сжатия с потерями. Полдюжины повторений, и вы получите очень нечеткое изображение, которое имеет мало сходства с оригиналом.


Member 13855757

Спасибо за подсказку насчет этого .файл JPEG. Может быть, вы случайно не знаете, как изменить свойства изображения, не переписывая его? Я еще раз протестирую свой код на этой неделе.

OriginalGriff

Какие свойства вы пытаетесь изменить?

Member 13855757

Это примерный код, который я использую для изменения значения свойства:
Dim propItems() как PropertyItem = Image1.PropertyItems
Dim propImageDescription как PropertyItem
propImageDescription = Image1.GetPropertyItem(270)
Dim szImageDescription As String = кодировка.Метода getString(propImageDescription.Ценность)
Dim propImageDescription как PropertyItem
propImageDescription = Image1.GetPropertyItem(270)
"" &амп szImageDescription = отделка(szImageDescription &амп;; ИМЯИСХОДНОГОФАЙЛА усилителя; _
Path.GetFileName(szOriginalFile))
пропимагедескрипция.Значение = кодировка.Метод getbytes(szImageDescription)
пропимагедескрипция.Len = кодировка.GetByteCount(szImageDescription)
Рис1.SetPropertyItem(propImageDescription)
- на данный момент свойства растрового изображения готовы к сохранению.

Member 13855757

Программа, кажется, начала работать. Если он снова начнет действовать, я начну новую нить. Спасибо за вашу помощь.