Member 14557501 Ответов: 2

Исключение системного ввода - вывода для MOVEFILE-файла, используемого другим процессом


Я тестирую новое приложение Visual Basic 2017, которое позволит пользователям выбирать файл из
каталог для обработки. После обработки приложение предназначено для перемещения файла в
резервный каталог.

Это работает для первого файла просто отлично, но на втором файле я получаю:
System.IO.IOException: 'процесс не может получить доступ к файлу
'J:\WindowsInvoices\Data\37_20180601_767437.CSV-потому что его использует кто-то другой.
процесс.'

Я пробовал и то, и другое: а) мой компьютер.Файловая Система.MoveFile(DataFullPath, BKPDataFullPath,
OverwriteBKP)

и Б) Мой компьютер.файловая система.CopyFile(DataFullPath, BKPDataFullPath, OverwriteBKP)
Мой.Компьютер.файловая система.Это(DataFullPath)

В варианте B исключение возникает при выполнении команды DeleteFile.

Есть предложения?

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

Более подробная информация, после комментариев и ответа: я должен предоставить больше информации. Это приложение считывает файл (csv) и печатает его в соответствии с набором контрольных записей. Он не записывает никаких файлов. Ниже приведен весь раздел кода, который испытывает ошибку. Как вы можете видеть, в своем текущем состоянии он просто открывает и (пытается) закрыть файл. Исключение составляется на уровне .это

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

        OpenFileDialog1.DefaultExt = ".CSV"
        OpenFileDialog1.AddExtension = True
        OpenFileDialog1.Filter = "Comma Separated Values | *.csv"
        OpenFileDialog1.InitialDirectory = Base_Mapped_Path & "Data"
        OpenFileDialog1.ReadOnlyChecked = True

        If OpenFileDialog1.ShowDialog = Windows.Forms.DialogResult.OK Then
            OpenFileDialog1.ReadOnlyChecked = True
            OpenFileDialog1.OpenFile()
            DataFullPath = OpenFileDialog1.FileName
            BKPDataFullPath = DataFullPath.Replace("Data", "Backup")

            ' load print data file into its work array
            'LoadDataArray()

            Dim OverwriteBKP As Boolean = True
            My.Computer.FileSystem.CopyFile(DataFullPath, BKPDataFullPath, OverwriteBKP)
            My.Computer.FileSystem.DeleteFile(DataFullPath)

            OpenFileDialog1.Dispose()

        End If

    End Sub

ZurdoDev

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

CHill60

Вы проверяли, есть ли у кого-нибудь из ваших пользователей открытый файл в Excel? Вот что обычно здесь происходит.
Даже если они говорят, что закрыли его, проверьте, что они полностью закрыли Excel, и спросите их, когда они в последний раз перезагружали свой компьютер.

2 Ответов

Рейтинг:
7

Member 14557501

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

Глядя на код в моем обновлении проблемы, есть только один оператор, который открывает файл, "OpenFileDialog1.Функция openfile()". Я прокомментировал эту строку кода, и все работает отлично. Теперь приложение радостно выбрасывает файл за файлом на принтер, перемещая файлы в папку резервного копирования по мере их обработки.

Спасибо всем, кто нашел время прочитать мою проблему, и особенно тем, кто нашел время помочь!


Рейтинг:
12

OriginalGriff

Поскольку ваше приложение обрабатывает файл, весьма вероятно, что оно все еще открыто, и поэтому оно используется при вызове CopyFile. Поскольку он открыт для записи чем - то, он не может быть открыт для чтения-операция "открыть для записи" устанавливает эксклюзивную блокировку файла, чтобы предотвратить другие задачи, изменяющие файл во время его работы.

Проверьте свой код обработки и убедитесь, что все потоки закрыты и правильно утилизированы, когда вы закончите с ними. Проблема, скорее всего, исчезнет.