Kip Posted June 27, 2008 Posted June 27, 2008 Hi, I want to read just a small part of a file. (Let's say: 1024B) Well, that looks easy; Just read the file and extract it with StringMid. But no. I really want to read only a very small piece of a file. And not the rest. Because i want to read files larger than 1 gig. If you read a file as large like that... (AutoIt crashes) So I want to read 1024B at the end of a file. How do I do this? Kip MailSpons: Fake SMTP server for safe email testing Dutch postcode & address API.
Xenobiologist Posted June 27, 2008 Posted June 27, 2008 Hi,you can give this a tryhttp://cpan.uwinnipeg.ca/dist/File-ReadBackwardsSo long,Mega Scripts & functions Organize Includes Let Scite organize the include files Yahtzee The game "Yahtzee" (Kniffel, DiceLion) LoginWrapper Secure scripts by adding a query (authentication) _RunOnlyOnThis UDF Make sure that a script can only be executed on ... (Windows / HD / ...) Internet-Café Server/Client Application Open CD, Start Browser, Lock remote client, etc. MultipleFuncsWithOneHotkey Start different funcs by hitting one hotkey different times
Kip Posted June 27, 2008 Author Posted June 27, 2008 well, that was just an example. I just want to read X bytes from position Y. MailSpons: Fake SMTP server for safe email testing Dutch postcode & address API.
H5O20H Posted June 27, 2008 Posted June 27, 2008 Use ReadProcessMemory from the address where you want to start reading. Valik, The Legendary programmer!Will be using that signature for 2 months due to my loss on a bet ):
zorphnog Posted June 27, 2008 Posted June 27, 2008 (edited) Try this: #include <WinApi.au3> Global $sInFilename, $hInFile, $aResult, $hBuffer, $nRead $sInFilename = "mybigfile.gho" ConsoleWrite(" " & $sInFilename & @LF) $hInFile = _WinAPI_CreateFile($sInFilename, 2, 2, 2) If $hInFile = 0 Then ConsoleWrite("!> [" & _WinAPI_GetLastError() & "] " & _WinAPI_GetLastErrorMessage() & @LF) $aResult = DllCall("Kernel32.dll", "dword", "SetFilePointer", "hwnd", $hInFile, "int", -1024, "ptr", 0, "dword", 2) ConsoleWrite(" File pointer position: " & $aResult[0] & @LF) $hBuffer = DllStructCreate("ubyte buffer[1024]") $pBuffer = DllStructGetPtr($hBuffer) If _WinAPI_ReadFile($hInFile, $pBuffer, 1024, $nRead) Then ConsoleWrite(" [" & $nRead & "] bytes read" & @LF) $sBuffer = StringTrimLeft(DllStructGetData($hBuffer, "buffer"), 2) For $i=0 To 31 $sTemp = StringLeft($sBuffer, 32) $sBuffer = StringTrimLeft($sBuffer, 32) ConsoleWrite(" " & $sTemp & @LF) Next Else ConsoleWrite("!> [" & _WinAPI_GetLastError() & "] " & _WinAPI_GetLastErrorMessage() & @LF) EndIf _WinAPI_CloseHandle($hInFile) Edited June 27, 2008 by zorphnog
cppman Posted June 27, 2008 Posted June 27, 2008 Pretty much the same thing as zorphnog, only in a UDF form...http://www.autoitscript.com/forum/index.ph...mp;#entry536465 Miva OS Project
PsaltyDS Posted June 27, 2008 Posted June 27, 2008 Hi,I want to read just a small part of a file. (Let's say: 1024B)Well, that looks easy; Just read the file and extract it with StringMid.But no. I really want to read only a very small piece of a file. And not the rest.Because i want to read files larger than 1 gig. If you read a file as large like that... (AutoIt crashes)So I want to read 1024B at the end of a file.How do I do this? KipSearch for randallc's APITailRW.au3 UDF. (Just search for "TailRW".) Valuater's AutoIt 1-2-3, Class... Is now in Session!For those who want somebody to write the script for them: RentACoder"Any technology distinguishable from magic is insufficiently advanced." -- Geek's corollary to Clarke's law
Kip Posted June 27, 2008 Author Posted June 27, 2008 Ok, thanks! MailSpons: Fake SMTP server for safe email testing Dutch postcode & address API.
zorphnog Posted June 30, 2008 Posted June 30, 2008 I made a little GUI script for reading file tails for anyone that is interested. expandcollapse popup#include <WinApi.au3> #include <GuiConstants.au3> $gMain = GUICreate("FileReadTail", 625, 482, 193, 125) GUICtrlCreateLabel("Filename:", 8, 12, 49, 17) $inFilename = GUICtrlCreateInput("", 64, 10, 281, 21) $btBrowse = GUICtrlCreateButton("Browse...", 360, 8, 75, 25, 0) $cbOffset = GUICtrlCreateCombo("128", 480, 10, 137, 25) GUICtrlSetData(-1, "256|512|1024|2048", "512") GUICtrlCreateLabel("Offset:", 440, 12, 35, 17) $edResults = GUICtrlCreateEdit("", 16, 56, 593, 377) GUICtrlSetFont(-1, 8.5, Default, Default, "Courier New") $btRead = GUICtrlCreateButton("Read", 264, 448, 75, 25, 0) GUICtrlSetState(-1, $GUI_DISABLE) $bRead = False GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $btBrowse $sFilename = FileOpenDialog("Select file to read...", "", "All (*.*)") If @error <> 1 Then GUICtrlSetData($inFilename, $sFilename) Case $btRead _ReadFileTail(GUICtrlRead($inFilename), GUICtrlRead($cbOffset)) EndSwitch If FileExists(GUICtrlRead($inFilename)) Then If Not $bRead Then GUICtrlSetState($btRead, $GUI_ENABLE) $bRead = True EndIf Else If $bRead Then GUICtrlSetState($btRead, $GUI_DISABLE) $bRead = False EndIf EndIf WEnd Func _ReadFileTail ($sInFilename, $nBytes) Local $hInFile, $aResult, $hBuffer, $nRead ; Open file for reading $hInFile = _WinAPI_CreateFile($sInFilename, 2, 2, 2) If $hInFile = 0 Then GUICtrlSetData($edResults, "!> [" & _WinAPI_GetLastError() & "] " & _WinAPI_GetLastErrorMessage() & @CRLF) Return EndIf ; Move file pointer to desired position $aResult = DllCall("Kernel32.dll", "dword", "SetFilePointer", "hwnd", $hInFile, "int", Int("-" & $nBytes), "long_ptr", 0, "dword", 2) $nPosition = $aResult[0] $nOffset = Int("0x" & StringRight(Hex($nPosition), 1)) $nPosition -= $nOffset ; Create file read buffer $hBuffer = DllStructCreate("ubyte buffer[" & $nBytes & "]") $pBuffer = DllStructGetPtr($hBuffer) If _WinAPI_ReadFile($hInFile, $pBuffer, $nBytes, $nRead) Then GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n", "Filename", $sInFilename)) GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n", "Pointer position", Hex($nPosition)), 1) GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n", "Pointer offset", $nOffset), 1) GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n\r\n", "Bytes read", $nRead), 1) $sBuffer = StringTrimLeft(DllStructGetData($hBuffer, "buffer"), 2) For $i=0 To ($nRead/16)+1 $sHex = "" $sWord = "" If $sBuffer = "" Then ExitLoop $sTemp = StringLeft($sBuffer, 32-($nOffset*2)) $sBuffer = StringTrimLeft($sBuffer, 32-($nOffset*2)) For $j=$nOffset To 15 $sHex &= StringLeft($sTemp, 2) If Mod($j, 2)=1 Then $sHex &= " " $nCode = Int("0x" & StringLeft($sTemp, 2)) If $nCode > 31 And $nCode < 127 Then $sWord &= Chr($nCode) Else $sWord &= "." EndIf $sTemp = StringTrimLeft($sTemp, 2) If $sTemp = "" Then ExitLoop Next If $i=0 Then GUICtrlSetData($edResults, StringFormat(" %s: %40s %16s\r\n", Hex($nPosition), $sHex, $sWord), 1) $nOffset = 0 Else GUICtrlSetData($edResults, StringFormat(" %s: %-40s %-16s\r\n", Hex($nPosition), $sHex, $sWord),1) EndIf $nPosition += 32 Next _WinAPI_CloseHandle($hInFile) Return StringTrimLeft(DllStructGetData($hBuffer, "buffer"), 2) Else GUICtrlSetData($edResults, "!> [" & _WinAPI_GetLastError() & "] " & _WinAPI_GetLastErrorMessage() & @CRLF) _WinAPI_CloseHandle($hInFile) EndIf EndFunc
soulhealer Posted June 15, 2009 Posted June 15, 2009 I made a little GUI script for reading file tails for anyone that is interested. expandcollapse popup#include <WinApi.au3> #include <GuiConstants.au3> $gMain = GUICreate("FileReadTail", 625, 482, 193, 125) GUICtrlCreateLabel("Filename:", 8, 12, 49, 17) $inFilename = GUICtrlCreateInput("", 64, 10, 281, 21) $btBrowse = GUICtrlCreateButton("Browse...", 360, 8, 75, 25, 0) $cbOffset = GUICtrlCreateCombo("128", 480, 10, 137, 25) GUICtrlSetData(-1, "256|512|1024|2048", "512") GUICtrlCreateLabel("Offset:", 440, 12, 35, 17) $edResults = GUICtrlCreateEdit("", 16, 56, 593, 377) GUICtrlSetFont(-1, 8.5, Default, Default, "Courier New") $btRead = GUICtrlCreateButton("Read", 264, 448, 75, 25, 0) GUICtrlSetState(-1, $GUI_DISABLE) $bRead = False GUISetState(@SW_SHOW) While 1 $nMsg = GUIGetMsg() Switch $nMsg Case $GUI_EVENT_CLOSE Exit Case $btBrowse $sFilename = FileOpenDialog("Select file to read...", "", "All (*.*)") If @error <> 1 Then GUICtrlSetData($inFilename, $sFilename) Case $btRead _ReadFileTail(GUICtrlRead($inFilename), GUICtrlRead($cbOffset)) EndSwitch If FileExists(GUICtrlRead($inFilename)) Then If Not $bRead Then GUICtrlSetState($btRead, $GUI_ENABLE) $bRead = True EndIf Else If $bRead Then GUICtrlSetState($btRead, $GUI_DISABLE) $bRead = False EndIf EndIf WEnd Func _ReadFileTail ($sInFilename, $nBytes) Local $hInFile, $aResult, $hBuffer, $nRead ; Open file for reading $hInFile = _WinAPI_CreateFile($sInFilename, 2, 2, 2) If $hInFile = 0 Then GUICtrlSetData($edResults, "!> [" & _WinAPI_GetLastError() & "] " & _WinAPI_GetLastErrorMessage() & @CRLF) Return EndIf ; Move file pointer to desired position $aResult = DllCall("Kernel32.dll", "dword", "SetFilePointer", "hwnd", $hInFile, "int", Int("-" & $nBytes), "long_ptr", 0, "dword", 2) $nPosition = $aResult[0] $nOffset = Int("0x" & StringRight(Hex($nPosition), 1)) $nPosition -= $nOffset ; Create file read buffer $hBuffer = DllStructCreate("ubyte buffer[" & $nBytes & "]") $pBuffer = DllStructGetPtr($hBuffer) If _WinAPI_ReadFile($hInFile, $pBuffer, $nBytes, $nRead) Then GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n", "Filename", $sInFilename)) GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n", "Pointer position", Hex($nPosition)), 1) GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n", "Pointer offset", $nOffset), 1) GUICtrlSetData($edResults, StringFormat("%17s: %s\r\n\r\n", "Bytes read", $nRead), 1) $sBuffer = StringTrimLeft(DllStructGetData($hBuffer, "buffer"), 2) For $i=0 To ($nRead/16)+1 $sHex = "" $sWord = "" If $sBuffer = "" Then ExitLoop $sTemp = StringLeft($sBuffer, 32-($nOffset*2)) $sBuffer = StringTrimLeft($sBuffer, 32-($nOffset*2)) For $j=$nOffset To 15 $sHex &= StringLeft($sTemp, 2) If Mod($j, 2)=1 Then $sHex &= " " $nCode = Int("0x" & StringLeft($sTemp, 2)) If $nCode > 31 And $nCode < 127 Then $sWord &= Chr($nCode) Else $sWord &= "." EndIf $sTemp = StringTrimLeft($sTemp, 2) If $sTemp = "" Then ExitLoop Next If $i=0 Then GUICtrlSetData($edResults, StringFormat(" %s: %40s %16s\r\n", Hex($nPosition), $sHex, $sWord), 1) $nOffset = 0 Else GUICtrlSetData($edResults, StringFormat(" %s: %-40s %-16s\r\n", Hex($nPosition), $sHex, $sWord),1) EndIf $nPosition += 32 Next _WinAPI_CloseHandle($hInFile) Return StringTrimLeft(DllStructGetData($hBuffer, "buffer"), 2) Else GUICtrlSetData($edResults, "!> [" & _WinAPI_GetLastError() & "] " & _WinAPI_GetLastErrorMessage() & @CRLF) _WinAPI_CloseHandle($hInFile) EndIf EndFunc the function return part of the file as a string variable? can we re-write the string variable into a new file? and the file still works like the way it used to be? i'm thinking about file sending through TCP/UDP socket...
soulhealer Posted June 15, 2009 Posted June 15, 2009 i mean, using TCP/UDP socket, so i can use it to send packets as strings, and later written back to a new file on the remote system. is this possible? or maybe can be done easily?
soulhealer Posted June 18, 2009 Posted June 18, 2009 i'm starting to feel that this thread is already abandoned or being ignored, i hope no one mind if i make a new thread discussing this.
Recommended Posts
Create an account or sign in to comment
You need to be a member in order to leave a comment
Create an account
Sign up for a new account in our community. It's easy!
Register a new accountSign in
Already have an account? Sign in here.
Sign In Now