[C] Set EOF / partial truncate van bestaande file

Pagina: 1
Acties:

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
In Windows heb je de functie SetEndOfFile om een file op een bepaalde lengte af te kappen. Maar wat is de portable C variant van deze functie?

Ik kan me vaag herinneren dat ergens een bepaalde functie een zero-write als set-eof beschouwd, maar _write en fwrite doen dat beiden niet.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

Volgens mij is de enige portable manier gewoon een 2e file openen voor schrijven, en dan alle contents tot de nieuwe EOF daarnaartoe schrijven. In de ISO C library is er iig geen functie voor, misschien dat er een POSIX variant is maar die wordt dan niet ondersteund onder windows (anders kon ik 'm wel vinden in de MSDN ;)).

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.


  • Soultaker
  • Registratie: September 2000
  • Laatst online: 04:19
Je kunt naar (f)truncate kijken, maar Win32 ondersteund die niet.

  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
.oisyn schreef op 20 juni 2004 @ 22:23:
Volgens mij is de enige portable manier gewoon een 2e file openen voor schrijven, en dan alle contents tot de nieuwe EOF daarnaartoe schrijven. In de ISO C library is er iig geen functie voor, misschien dat er een POSIX variant is maar die wordt dan niet ondersteund onder windows (anders kon ik 'm wel vinden in de MSDN ;)).
Het gaat hier over (multi-)gbyte files, dus even alles kopieeren is niet echt handig.

Toch bedankt.

Ik zat ook nog te denken, het zou ook handig zijn om aan het begin of ergens in het midden 'blocks' van een file te deleten of naar een andere file te moven.
Zijn er filesystems die dit soort exotische functies ondersteunen?

  • JayTaph
  • Registratie: Oktober 1999
  • Laatst online: 28-11-2025

JayTaph

Portability is for canoes.

POSIX variant is inderdaad ftruncate..

En anders make je toch een wrapper voor ftrunate dmv SetFilePointer en SetEndOfFile?

Moven van blocks word iets lastiger... Zonder tmp copy wordt het vrij ingewikkeld zoniet onmogelijk (alhoewel ik vroeger ooit zoiets gedaan heb door rechtstreeks de benodigde fat-blokken te linken naar een andere file, zodat ik in totaal misschien maar 4 kleine blokken hoefde aan te passen voor de 2 files.. raaaazendsnel :-))

Helaas niet een heel goed idee onder windows. Maar zoiets is zeker nog wel te doen met inode-blocks onder unix bedenk ik me net... (*idee krijg* :) )

[ Voor 66% gewijzigd door JayTaph op 21-06-2004 16:27 . Reden: i don't need no steeenkin' reason ]

Yo dawg, I heard you like posts so I posted below your post so you can post again.


  • Olaf van der Spek
  • Registratie: September 2000
  • Niet online
JayTaph schreef op 21 juni 2004 @ 16:23:
Moven van blocks word iets lastiger... Zonder tmp copy wordt het vrij ingewikkeld zoniet onmogelijk (alhoewel ik vroeger ooit zoiets gedaan heb door rechtstreeks de benodigde fat-blokken te linken naar een andere file, zodat ik in totaal misschien maar 4 kleine blokken hoefde aan te passen voor de 2 files.. raaaazendsnel :-))

Helaas niet een heel goed idee onder windows. Maar zoiets is zeker nog wel te doen met inode-blocks onder unix bedenk ik me net... (*idee krijg* :) )
Technisch lijkt het me met elk FS geen issue. Maar de APIs ondersteunen het volgens mij gewoon niet.

  • .oisyn
  • Registratie: September 2000
  • Laatst online: 22-05 23:07

.oisyn

Moderator Devschuur®

Demotivational Speaker

JayTaph schreef op 21 juni 2004 @ 16:23:
En anders make je toch een wrapper voor ftrunate dmv SetFilePointer en SetEndOfFile?
makkelijker gezegd dan gedaan; de handles die open () retourneert onder windows zijn gewone runtime handles, geen OS handles. De win32 API functies willen echter een HANDLE, en het is niet zomaar mogelijk om de HANDLE bij de int te vinden. Dan zou je eigenlijk alleen maar truncate () kunnen gebruiken

Give a man a game and he'll have fun for a day. Teach a man to make games and he'll never have fun again.

Pagina: 1