A question that comes up occasionally on the forums is how to determine if a file is being written to by another process. It can cause issues if a file is partially written when a source component starts extracting data from it.
There is a way to check this through a Script Task. The script below attempts to lock the file for writing. If the file is be written to be another process, the attempt to lock it will fail. If the file is available, the attempt will succeed.
Public Sub Main()
Dim vars As Variables
Dim file As System.IO.FileStream
Try
file = System.IO.File.Open(Dts.Connections("FlatFile").ConnectionString, System.IO.FileMode.Open, System.IO.FileAccess.Write)
Catch ex As Exception
Dts.VariableDispenser.LockOneForRead("FileLocked", vars)
vars("FileLocked").Value = True
vars.Unlock()
Finally
If Not file Is Nothing Then
file.Close()
End If
End Try
Dts.TaskResult = Dts.Results.Success
End Sub
The package needs to have a connection manager that points to the file you want to check (named "FlatFile" in the script above), and a variable ("FileLocked") that is set to True if the file is locked. The variable should be set to False by default. The variable can be used in a precedence constraint to control whether other tasks execute.