SetFilePointer
C# Signature:
public enum EMoveMethod : uint
{
Begin = 0,
Current = 1,
End = 2
}
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern unsafe uint SetFilePointer(
[In] SafeFileHandle hFile,
[In] int lDistanceToMove,
[Out] int* lpDistanceToMoveHigh,
[In] EMoveMethod dwMoveMethod);
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
static extern uint SetFilePointer(
[In] SafeFileHandle hFile,
[In] int lDistanceToMove,
[Out] out int lpDistanceToMoveHigh,
[In] EMoveMethod dwMoveMethod);
VB Signature:
Public Enum EMoveMethod As System.UInt32
FILE_BEGIN = 0
FILE_CURRENT = 1
FILE_END = 2
End Enum
<DllImport("kernel32.dll", SetLastError:=True)> _
Shared Function SetFilePointer( _
ByVal hFile As IntPtr, _
ByVal lDistanceToMove As Integer, _
ByRef lpDistanceToMoveHigh As IntPtr, _
ByVal dwMoveMethod As EMoveMethod) _
As System.UInt32
End Function
Public Const INVALID_SET_FILE_POINTER As Integer = -1
Sample Code:
[DllImport("Kernel32.dll", SetLastError = true, CharSet = CharSet.Auto)]
private static extern int SetFilePointer(IntPtr handle, int lDistanceToMove, out int lpDistanceToMoveHigh, uint dwMoveMethod);
public long Seek(IntPtr handle, long offset, SeekOrigin origin)
{
uint moveMethod = 0;
switch (origin)
{
case SeekOrigin.Begin:
moveMethod = 0;
break;
case SeekOrigin.Current:
moveMethod = 1;
break;
case SeekOrigin.End:
moveMethod = 2;
break;
}
int lo = (int)(offset & 0xffffffff);
int hi = (int)(offset >> 32);
lo = SetFilePointer(handle, lo, out hi, moveMethod);
if (lo == -1)
{
if (GetLastError() != 0)
{
throw new Exception("INVALID_SET_FILE_POINTER");
}
}
return (((long)hi << 32) | (uint)lo);
}
Última actualización