Skip to content

Commit

Permalink
#29: Add workaround for Directory.CreateDirectory() errors.
Browse files Browse the repository at this point in the history
  • Loading branch information
DragonQ committed Jun 6, 2020
1 parent 05cb294 commit 13b03d6
Showing 1 changed file with 31 additions and 7 deletions.
38 changes: 31 additions & 7 deletions src/File Parser/FileParser.vb
Original file line number Diff line number Diff line change
Expand Up @@ -169,7 +169,6 @@ Class FileParser
Throw New Exception(Result.ErrorMessage)
End If
Else
Directory.CreateDirectory(Path.GetDirectoryName(SyncFilePath), DirectoryAccessPermissions)
Dim Result As ReturnObject = SafeCopy(SourceFileStream, SyncFilePath)
If Not Result.Success Then Throw New Exception(Result.ErrorMessage)
End If
Expand Down Expand Up @@ -217,8 +216,8 @@ Class FileParser
End If

If File.Exists(OldSyncFilePath) Then
Dim DirName = Path.GetDirectoryName(SyncFilePath)
If Not Directory.Exists(DirName) Then Directory.CreateDirectory(DirName, DirectoryAccessPermissions)
Dim Result As ReturnObject = SafeCreateDirectory(Path.GetDirectoryName(SyncFilePath))
If Not Result.Success Then Throw New Exception(Result.ErrorMessage)
File.Move(OldSyncFilePath, SyncFilePath)
MyLog.Write(ProcessID, "...successfully renamed file in sync directory.", Debug)

Expand All @@ -242,7 +241,6 @@ Class FileParser
Throw New Exception(Result.ErrorMessage)
End If
Else
Directory.CreateDirectory(Path.GetDirectoryName(SyncFilePath), DirectoryAccessPermissions)
Result = SafeCopy(SourceFileStream, SyncFilePath)
If Not Result.Success Then Throw New Exception(Result.ErrorMessage)
End If
Expand Down Expand Up @@ -273,8 +271,9 @@ Class FileParser

Try
Dim OutputDirectory As String = Path.GetDirectoryName(FileTo)
Dim Result As ReturnObject = SafeCreateDirectory(OutputDirectory)
If Not Result.Success Then Throw New Exception(Result.ErrorMessage)
OutputFilePath = Path.Combine(OutputDirectory, Path.GetFileNameWithoutExtension(FileTo)) & SyncSetting.Encoder.GetFileExtensions(0)
Directory.CreateDirectory(OutputDirectory, DirectoryAccessPermissions)
Catch ex As Exception
Dim MyError As String = ex.Message
If ex.InnerException IsNot Nothing Then
Expand Down Expand Up @@ -330,8 +329,8 @@ Class FileParser

Try
If SourceFileStream Is Nothing Then Throw New Exception("Could not get file system lock on source file.")
Dim OutputDirectory As String = Path.GetDirectoryName(SyncFilePath)
Directory.CreateDirectory(OutputDirectory, DirectoryAccessPermissions)
Dim Result As ReturnObject = SafeCreateDirectory(Path.GetDirectoryName(SyncFilePath))
If Not Result.Success Then Throw New Exception(Result.ErrorMessage)
Using NewFile As FileStream = WaitForFile(SyncFilePath, FileMode.CreateNew, FileAccess.ReadWrite, FileShare.None, FileTimeout)
If Not NewFile Is Nothing Then
SourceFileStream.CopyTo(NewFile)
Expand All @@ -348,6 +347,31 @@ Class FileParser

End Function

Private Function SafeCreateDirectory(DirName As String) As ReturnObject

Dim MyReturnObject As ReturnObject

Try
If Not Directory.Exists(DirName) Then Directory.CreateDirectory(DirName, DirectoryAccessPermissions)
MyReturnObject = New ReturnObject(True, "")
Catch ex As Exception
Dim MyError As String = ex.Message
If ex.InnerException IsNot Nothing Then MyError &= NewLine & NewLine & ex.InnerException.ToString
If MyError.Contains("because a file or directory with the same name already exists") Then
' For some reason CreateDirectory sometimes fails because the directory already exists,
' even though it shouldn't.
MyLog.Write(ProcessID, "Couldn't create directory; it apparently already exists. Continuing...", Debug)
MyReturnObject = New ReturnObject(True, "")
Else
MyLog.Write(ProcessID, "Couldn't create directory, will retry. Exception: " & MyError, Debug)
MyReturnObject = New ReturnObject(False, MyError)
End If
End Try

Return MyReturnObject

End Function

Private Shared Function WaitForFile(fullPath As String, mode As FileMode, access As FileAccess, share As FileShare, timeoutSeconds As Int32) As FileStream
Dim msBetweenTries As Int32 = 500
Dim numTries As Int32 = CInt(Math.Ceiling(timeoutSeconds / (msBetweenTries / 1000)))
Expand Down

0 comments on commit 13b03d6

Please sign in to comment.