Toon posts:

CreateFile/WriteFile API

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

Verwijderd

Topicstarter
Gegroet ppl,

Ik ben al de hele middag op zoek naar een voorbeeld hoe ik m.b.v. API functies een string waarde kan toevoegen aan een bestand. Weet iemand dit? Ik maak gebruik van Visual Basic.

Groeten,

Robin

  • Pc123
  • Registratie: Oktober 2000
  • Laatst online: 15-09 20:53
Write #1, str$

Verwijderd

Topicstarter
*sigh* .. A - P - I ?

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Als je CreateFile al hebt gedaan, dan kan je met ReadFile en WriteFile lezen en schrijven. Ik weet niet zo exact de parameters, maar je geeft in elk geval een buffer mee, waarin de te lezen/schrijven data staat, en een integer met de lengte van die data.

In de help van win32 staat 't allemaal uitstekend beschreven.

edit:

BOOL WriteFile(

HANDLE hFile,// handle to file to write to
LPCVOID lpBuffer,// pointer to data to write to file
DWORD nNumberOfBytesToWrite,// number of bytes to write
LPDWORD lpNumberOfBytesWritten,// pointer to number of bytes written
LPOVERLAPPED lpOverlapped // pointer to structure needed for overlapped I/O
);

Siditamentis astuentis pactum.


  • gotcha
  • Registratie: Oktober 1999
  • Laatst online: 29-07 18:20
moet je niet met de API willen doen. microsoft heeft daar het filesystem object voor uitgevonden.
zoek ff in msdn (msdn.microsoft.com als je de dvd niet hebt) op scripting.filesystemobject, daarmee moet je er zeker uit kunnen komen.

werkwijze:
1) open file
2) append een stuk tekst aan de file
3) sluit de file
4) klaar is vraagsteller :)

Verwijderd

Topicstarter
Dat staat het dus niet :'(
Er staat wel het een en 't ander maar ik krijg 'em niet geappended..

Verwijderd

Topicstarter
FileSystemObject? iiiieeeeeew...!
Ik moet 90 requests per seconde processen met klein beetje cpu power en dan is dat object veel te traag hoor!

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

En dit is ook een handige API-functie voor files:

DWORD SetFilePointer(

HANDLE hFile,// handle of file
LONG lDistanceToMove,// number of bytes to move file pointer
PLONG lpDistanceToMoveHigh,// address of high-order word of distance to move
DWORD dwMoveMethod // how to move
);

Siditamentis astuentis pactum.


  • Biedzjee
  • Registratie: December 2000
  • Laatst online: 14-08-2025
Als ik het goed begrijp is het probleem het appenden... dus je kunt je wel het bestand openen en er iets in wegschrijven?

Appenden is dan niet zo heel moeilijk, er is (from the top of my head) een extra parameter voor CreateFile die de file in "append" mode opent....

Trying to establish voice contact... please yell into keyboard.


Verwijderd

Topicstarter
yep.. openen en schrijven is geen probleem.. maar inderdaad p'cies *die* ene parameter kan ik dus helemaal nergens vinden :(
Help? :?

  • Varienaja
  • Registratie: Februari 2001
  • Laatst online: 14-06-2025

Varienaja

Wie dit leest is gek.

Appenden is volgens mij niet een speciale functie van CreateFile. Je doe gewoon:

CreateFile (bestand, etc. etc)
SetFilePointer (0 bytes vanaf het einde)
WriteFile (je stringetje)
CloseFile (ding weer dicht)

Heb je niet de helpfile van win32??? Daar staat alles perfect in!

Siditamentis astuentis pactum.


  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

is OPEN, PRINT#, INPUT#, WRITE# etc. niet veel sneller dan het FileSystem Object?? Ranzig is VB toch al, dus daar hoef je niet over te beginnen :D

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

Topicstarter
Limoentje,

De VB file functies zijn veeeeeeel trager dan het FileSystemObject. En het FileSystemObject is ook nog heel wat trager dan de API functies. Daarnaast moet je weer een object aanmaken en dat geeft ook overhead.

Veel VB functies zijn erg traag: vanochtend heb ik mijn string contatenation 700 keer kunnen versnellen door API's toe te passen. Ook mijn Winsock control heb ik de deur uit gedaan en vervangen door API's. Ook dit verbeterd de snelheid aanzienlijk.

Ook zijn de API's niet zo versie gebonden als veel objecten en dus is je applicatie meer compatible met andere Windows versies.

Verwijderd

Topicstarter
Nou omdat jullie allemaal zo behulpzaam waren, zal ik zelf ff de oplossing posten (misschien bruikbaar?):

Const MOVEFILE_REPLACE_EXISTING = &H1
Const FILE_ATTRIBUTE_TEMPORARY = &H100
Const FILE_BEGIN = 0
Const FILE_SHARE_READ = &H1
Const FILE_SHARE_WRITE = &H2
Const CREATE_NEW = 1
Const OPEN_EXISTING = 3
Const GENERIC_READ = &H80000000
Const GENERIC_WRITE = &H40000000
Const OPEN_ALWAYS = 4

Private Declare Function SetVolumeLabel Lib "kernel32" Alias "SetVolumeLabelA" (ByVal lpRootPathName As String, ByVal lpVolumeName As String) As Long
Private Declare Function WriteFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToWrite As Long, lpNumberOfBytesWritten As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function ReadFile Lib "kernel32" (ByVal hFile As Long, lpBuffer As Any, ByVal nNumberOfBytesToRead As Long, lpNumberOfBytesRead As Long, ByVal lpOverlapped As Any) As Long
Private Declare Function CreateFile Lib "kernel32" Alias "CreateFileA" (ByVal lpFileName As String, ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, ByVal lpSecurityAttributes As Any, ByVal dwCreationDisposition As Long, ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32" (ByVal hObject As Long) As Long
Private Declare Function SetFilePointer Lib "kernel32" (ByVal hFile As Long, ByVal lDistanceToMove As Long, lpDistanceToMoveHigh As Long, ByVal dwMoveMethod As Long) As Long
Private Declare Function SetFileAttributes Lib "kernel32" Alias "SetFileAttributesA" (ByVal lpFileName As String, ByVal dwFileAttributes As Long) As Long
Private Declare Function GetFileSize Lib "kernel32" (ByVal hFile As Long, lpFileSizeHigh As Long) As Long
Private Declare Function GetTempFileName Lib "kernel32" Alias "GetTempFileNameA" (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As Long
Private Declare Function MoveFileEx Lib "kernel32" Alias "MoveFileExA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal dwFlags As Long) As Long
Private Declare Function DeleteFile Lib "kernel32" Alias "DeleteFileA" (ByVal lpFileName As String) As Long

Sub TestFile()

Dim hFile As Long, hPos As Long
Dim Ret As Long
Dim sData As String

sData = "gegroet" & vbCrLf

hFile = CreateFile("c:\test.txt", GENERIC_WRITE, FILE_SHARE_WRITE, ByVal 0&, OPEN_ALWAYS, 0, 0)
hPos = GetFileSize(hFile, 0)
Debug.Print hPos
SetFilePointer hFile, hPos, 0, FILE_BEGIN

WriteFile hFile, ByVal sData, Len(sData), Ret, ByVal 0&

CloseHandle hFile

End Sub

Verwijderd

Topicstarter
Hmm ik hoef GetFileSize() niet eens aan te roepen zie ik..

SetFilePointer hFile, 0, 0, FILE_END

is voldoende

  • roelio
  • Registratie: Februari 2001
  • Niet online

roelio

fruitig, en fris.

Op woensdag 31 oktober 2001 16:15 schreef vertig0 het volgende:
De VB file functies zijn veeeeeeel trager dan het FileSystemObject. En het FileSystemObject is ook nog heel wat trager dan de API functies. Daarnaast moet je weer een object aanmaken en dat geeft ook overhead.
...
Ook zijn de API's niet zo versie gebonden als veel objecten en dus is je applicatie meer compatible met andere Windows versies.
thanx voor deze uitleg, top!!

AMD Phenom II X4 // 8 GB DDR2 // SAMSUNG 830 SSD // 840 EVO SSD // Daar is Sinterklaas alweer!!


Verwijderd

foutje :)
Pagina: 1