Я закрываю и удаляю локально объявленный streamwriter, но я все еще получаю использование файла другим исключением процесса - PullRequest
0 голосов
/ 20 декабря 2011

Я пытаюсь достичь нескольких вещей:

  1. объединить несколько отдельных текстовых файлов в объединенный файл,
  2. переместить объединенные файлы в новую папку.

Я назначил каждую из этих задач методу.

Что-то в первом методе висит на файле, хотя я закрываю и утилизирую потоковое считывающее устройство - но я не могу понять, что именно.Я знаю, что процесс из первого метода висит в файле, потому что, когда я закомментирую первый метод, второй метод перемещает файлы без проблем.

РЕДАКТИРОВАТЬ Первый метод возвращает значение для нового большого файла.Это передается как параметр для второго метода.Когда второй метод пытается обратиться к этому файлу, то есть когда программа выдает ошибку (5-я строка снизу)

Большинство постов в SO советуют закрывать / утилизировать объекты ввода-вывода, но я уже делаю это,Они также советуют использовать сторонний инструмент для изучения того, какой процесс висит в файле, но я уже знаю, что это первый метод слияния (потому что, когда он закомментирован, программа запускается).

Это пример похожего вопроса: https://stackoverflow.com/questions/8088225/file-use-by-another-process-exception-in-c-sharp

Чего мне не хватает?

newBigFile as string = mergeFiles (inputLocation, outputLocation) 
moveFiles = moveMergedFiles(inputLocation, outputLocation, newBigFile)

Private Function mergeFiles(ByVal inputLocationFilesToMerge As String, ByVal outputLocationHL7 As String) As String


    Dim newMergedFile As String = inputLocationFilesToMerge & "\jointFile" & DateTime.Now.Month & DateTime.Now.Day & DateTime.Now.Year & DateTime.Now.Hour & DateTime.Now.Minute & ".hl7"
    Dim objWriter As New System.IO.StreamWriter(newMergedFile)
    Dim HL7FilePaths As String() = System.IO.Directory.GetFiles(inputLocationFilesToMerge, "*.hl7")

    For Each p As String In HL7FilePaths
        Dim sr As StreamReader = New StreamReader(p)
        objWriter.Write(sr)
        sr.Close()
        sr.Dispose()
    Next

    objWriter.Close()
    objWriter.Dispose()

    Return (newMergedFile) 

End Function

Private Sub moveMergedFiles(ByVal inputLocationFilesToMerge As String, ByVal outputLocationHL7 As String, ByVal mergedFile As String)


    For Each q As String In System.IO.Directory.GetFiles(inputLocationFilesToMerge, "*.hl7")
        If (Not (q = mergedFile)) Then **this is where the error comes from**
            File.Move(q, outputLocationHL7 & "\" & Path.GetFileName(q)) 
        End If
    Next
End Sub

Ответы [ 4 ]

2 голосов
/ 20 декабря 2011

На линии objWriter.Write(sr) разве вы не должны звонить sr.ReadToEnd()? Похоже, вы передаете объект streamReader, а не данные потока (если не существует неявного приведения, о котором я не знаю).

Если память не имеет значения, возможно, попробуйте заменить StreamReader на быстрый File.ReadAllBytes(filename). По крайней мере, так вы можете увидеть, является ли это streamReader или нет.

1 голос
/ 20 декабря 2011
Dim objWriter As New System.IO.StreamWriter(newMergedFile)

Где еще в коде это используется?- Обычно это происходит из-за того, что вы создаете слишком много новых экземпляров или поток этого файла все еще открыт, просто создайте глобальный экземпляр objWriter As New System.IO.StreamWriter(newMergedFile)

Затем, когда закончите, закройте его с помощью objWriter.Close() Я поддерживаюиз этого ... код выглядит путаницей и не имеет четкой мысли и направления ..

0 голосов
/ 20 декабря 2011

Две проблемы ...
1) Вы пытаетесь открыть файл JointFile для чтения, когда он используется для записи.
2) Вам нужно прочитать файл с sr.ReadToEnd, как указаноах

Изменение:

For Each p As String In HL7FilePaths      
     Dim sr As StreamReader = New StreamReader(p)   
     objWriter.Write(sr)           
     sr.Close()
     sr.Dispose()       
Next   

Кому:

For Each p As String In HL7FilePaths
            If p <> newMergedFile Then
                Dim sr As StreamReader = New StreamReader(p)
                objWriter.Write(sr.ReadToEnd)
                sr.Close()
                sr.Dispose()
            End If
Next
0 голосов
/ 20 декабря 2011

Вы не избавляетесь от objwriter.Я бы также посоветовал вам использовать FileStream для физических файлов

и последнее, но далеко не наименее важное значение, используя

Так что в C # (ish) я не являюсь главой VB

using (FileStream fs = new FileStream(newMergedFile, FileMode.Create, FileAccess.Write))
{
    TextWriter objWriter = new StreamWriter(fs);
    foreach(String fileName in HL7FilePaths)
    {
        using (FileStream frs = new FileStream(fileName,FileMode.Open, FileAccess.Read))
        {
            ObjWriter.AppendStream(frs);
            ObjWriter.Flush(); 
        }
    }
}

Не могу вспомнить точный синтаксис для нового FileStream, Create и ReadWrite для объединенного файла и Open and read для FileMode, и FileAccess или что-то подобное обычно делают эту работу.

Просто привычка, которую мы имеемразработано, всегда используйте блок using, который закроет и утилизирует для вас, Flush (), чтобы убедиться, и FileStream не сможет получить файл, если что-то не так задолго до того, как вы попытаетесь прочитать или написать.

Редко возникают проблемы с файлами, если вы следуете что-то вроде этого пути.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...