Avatar billede spectual Nybegynder
22. maj 2002 - 19:30 Der er 11 kommentarer og
1 løsning

Truncate eller hvad...?

Hej.

Forestil dig, at du har en fil på 100 bytes.

Forestil dig så, at du klipper filen, således du kun har fra byte 50-99 i filen.

1) Hvad hedder den proces?

2) Kan det lade sig at progammere dette **uden** at kopiere byte 50-99 til en ny fil og så slette den gamle?
(i Visual C++ eller delphi)
Avatar billede jakoba Nybegynder
22. maj 2002 - 19:36 #1
1) der er ikke noget specielt navn for det. "at kopiere en del af en fil".

2) Nej det kan man ikke. du må oprette en ny fil, lukke den, slette den gamle fil og så rename den nye til det ganmle navn

mvh JakobA
Avatar billede jakoba Nybegynder
22. maj 2002 - 19:39 #2
2) eller jo. der er jo plads til det hele i memory.
Åben filen for både læsning og skrivning.
læs filen og gem bytes fra nr 50 i et array.
reset filen
skriv de ønskede bytes ud i filen. og luk den.

mvh JakobA
Avatar billede spectual Nybegynder
22. maj 2002 - 19:41 #3
ja okay.. nu var det bare et eksempel. når det kører bliver det med 1-1.5 gb.'s filer :o)
Avatar billede spectual Nybegynder
22. maj 2002 - 19:43 #4
tjae.. det kunne måske godt lade sig gøre hvis man gik ind og rodede direkte i fat'en på harddisken ...
Avatar billede jakoba Nybegynder
22. maj 2002 - 19:44 #5
Så ville jeg definitivt bruge 2 filer og rename. ( tænk hvis dyret går ned, lige som du har resat. så er dine 1.5Gb (-50byte) tabt :-))
Avatar billede spectual Nybegynder
22. maj 2002 - 19:47 #6
det er også så'rn det virker nu.. det er bare lidt træls, at programmet kræver 3 gb. fri plads, når filen egentlig kun bliver 1.5.

jeg lader lige spørgsmålet stå nogle dage til hvis jeg skulle finde en løsning selv - forløbig tak for dit svar :o)
Avatar billede jakoba Nybegynder
22. maj 2002 - 19:50 #7
an: 22/05-2002 19:43:17
Det tror jeg faktisk ikke, husk at filer bliver gemt i blokke. der er vinst ingen mekanik til at sige 'men ignorer de første 50 i blok nummer 0'

Du kunne evt lave en lokal liste til dig selv, som du så kan slå op i og ske om de første xx bytes skal skippes i den fil.
Avatar billede spectual Nybegynder
22. maj 2002 - 19:57 #8
det er heller ikke 50 bytes - det er i størrelsesordenen 20000 bytes af gang ca. (forsigtigt gæt).

Det behøver heller ikke være præcist, bare programmet ved, hvor meget der er klippet af starten af filen.

Den eneste årsag til, at jeg vil lave denne her funktionalitet, er for at sænke kravene om diskplads.

Den kopierer en smule fra kildefilen, arbejder lidt på nogle data, skriver det ned i den nye, o.s.v. Hvis programmet bare ved hvor henne i filen de data den skal bruge ligger, er det sådan set underordnet hvor meget der bliver cuttet af (bare det ikke er _for_ meget selvfølgelig :o) )
Avatar billede spectual Nybegynder
22. maj 2002 - 19:58 #9
hvis der bliver cuttet f.eks. 1 mb. af filen pr. gang ville det også være fint - alle folk har da 1 mb. fri :o)
Avatar billede jakoba Nybegynder
22. maj 2002 - 20:13 #10
Det du ser for dig er en database.
Men prøv engang at holde øje med diskforbruget for en stor databasefil mens der tilføjes eller fjernes en række. De bruger helt sikker 2-filer metoden. for at undgå den forskrækkelige situation hvor noget går galt midti så de mister hele resten af databasen.

Med en index-sekventiel fil (det findes helt sikkert i pascal(delphi) ved ikke med C++) kan du skrive til de enkelte blokke i en fil. og hvis filen så er 'formatteret' på en måde der er til at hitte ud af kan du evt gøre det direkte.

Formateringen kunne fx bestå af headers foran hver datagruppe i filen hvor headeren fortæller hvor stor næste gruppe er og hvad type data der er i den. så tilføjer du blot en datatype for 'slettet' som du så kan indskrive når noget skal fjernes. Data ligger der stadig, men bliver ignoreret.

Hvis man må forvente at der sker mange ændringer i den fil, kan det dog gå hen og ende med at filen selv bliver uacceptabelt lang fordi den efterhånden bliver helt fuld af 'døde' data.

prøv at lede på 'index sekvential' om det kan bruges. fx: http://www.dcs.gla.ac.uk/~iain/keith/data/concepts/142.htm

mvh JakobA
Avatar billede jakoba Nybegynder
22. maj 2002 - 20:18 #11
PS: idag koster en 80Gb harddisk desamme som en 100Mb harddisk kostede for 5 år siden.

Er du sikker på dit problem er alvorligt nok til at retfærdiggøre en komplex løsning. fremfor en simpel og overskuelig (omend krævende) genskrivning.
Avatar billede spectual Nybegynder
22. maj 2002 - 20:23 #12
Nej, så stort et problem er det overhovedet ikke. det er ikke et problem, jeg vil gøre så meget ud af at løse, fordi det virker fint nok nu, som det er, men bruger så bare temmelig meget diskplads. der er så mange andre problemer i det program, som trænger meget mere til at blive løst. Tak for din indsats. Hvis jeg en dag skulle finde ud af at klippe blokke af en fil ved at ændre i fat'en, så skriver jeg det her. Så vidt jeg kan finde ud af, er det ikke så let pga. nogle windows blokeringer, men det kan lade sig gøre, for jeg har et program, der kan gøre det.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester