 |
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 01.07.2009, 21:06 Titel: Dateien |
|
|
Der Titel hört sich jetzt vl. etwas an, als wäre ich ein blutiger Anfänger in Sachen programmierung, aber trotzdem hab ich ein paar Fragen zu diesem Thema:
Ich möchte nicht (wie bis jetzt immer) neue Dateien erstellen bzw. aus exisitierenden herauslesen (das kann ich natürlich schon), sondern bestehende Dateien bearbeiten.
So möchte ich in eine Datei an einer beliebigen Stelle z.B. Daten einfügen. Dabei muss gewährleistet werden, dass im Falle eines Absturzes des Programms eine funktionstüchtige Datei bestehen bleibt. Die einzige Möglichkeit die mir eingefallen ist, wäre eine neue Datei zu erstellen, die neuen Daten dort hineinzuschreiben, die alte löschen und der neuen den Namen der alten geben. Das was mich daran stört ist, dass z.B. das Erstellungsdatum oder ADS ( http://de.wikipedia.org/wiki/Alternate_Data_Streams ) der Datei verloren gehen.
Eine Datei zu vergrößern geht ganz einfach: einfach hinten Daten dran schreiben. Ist es auch das Gegenteil möglich? Eine Datei verkleinern? _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 01.07.2009, 22:51 Titel: |
|
|
Unter Windows ist das teilweise möglich, Da musst du mit der API arbeiten und z.B. zum vergrössern udn verkleniern einen Filepointer setzen. Unter linux habe ich das noch nicht gemacht.
Aber, so wie ich die OS's kenne, wird das nicht möglich sein.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 02.07.2009, 13:09 Titel: |
|
|
Wenn möglich, möchte ich eher plattformunabhängig bleiben. Gibts von FreeBasic da eine Möglichkeit?
Es kann ja nicht sooo kompliziert sein. Notepad in Windows z.B. kann das ja auch. (Datei wird kleiner wenn Text gelöscht wird, größer wenn Text eingefügt wird und z.B. Dateidatum bleibt erhalten).
Niemand eine Ahnung wie das z.B. bei Notepad funktioniert? _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 02.07.2009, 13:20 Titel: |
|
|
Zitat: | Dabei muss gewährleistet werden, dass im Falle eines Absturzes des Programms eine funktionstüchtige Datei bestehen bleibt. |
Wenn das "das oberste Gebot" sein soll, wirst du keine andere Möglichkeit haben.
Datei laden, bearbeiten, unter neuem Namen speichen;
alte Datei umbenennen (als "alt" kennzeichnen, zur Datenwiederherstellung nicht löschen);
neue Datei umbenennen.
Mit dieser Methode bleibt dir verlängern oder verkürzen der Datei erspart.
In einer Datei kannst du mit BINARY arbeiten. _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 02.07.2009, 13:32 Titel: |
|
|
@St_w .. Notepad macht das etwas anders .. er läd die gesammte Datei in den speicher (unter win sind das max. 64KB pro Notepad), dann kansnt du sie dort verarbeiten, und anschleissend wird die datei vollständig neu erzeugt.
Wordpad hingegen arbeitet mit eienr temporär-datei. Es wird also niemals direkt die datei manipuliert.
Das Problem liegt am Dateisystem. Es ist nicht für solche modifikationen konzipiert. (warum auch immer) .. es fehlen eifnach die funktionen, um clustersegmente zu verschieben.
edenke, das es zu einem Speicherproblem kommen kann.
Das Dateisystem nutzt sogenante Segmente von 512Byte (auch 4Kbytes sind möglich .. das is Dateisystem spezisch). Es werden also immer 512 Byte parallel gelesen und geschrieben.
Hast du eine Datei welche 1024 byte gross ist, sind das folglich 2 segmente.
Fügst du jetzt beispielsweise 1 byte zwischen segment 1 udn 2 ein, kann man sich überlgen, was da sdateisystem machen könnte.
die Erste variante wäre, ein segment einzufügen, das dieses 1 byte aufnimt. Dadurch wären jedoch 511Bytes verlohren. macht man dies öffter, ist irgend wann die gesammte platte mit müll zu gestopft, der nicht voll ausgelastet die daten hinterlegt.
eine andere alternative ist das verschieben von daten pro segment. (ähnlich eines Arrays, in dem ein segment entfernt wird). Man kann sich vorstellen, das solch eine verschieberei nicht nur zu lasten der platte geht, sondern auch auf die performanc. Daher lässt man das ganz sein, arbeitet im speicher, und erzeugt einfach neue datein.
Anders ist es beim anhängen von Daten. Hier kann man problemlos die segmente solange auffüllen, bis sie voll sidn, und anschliessend ein neues erzeugen.
Als Tip könnte ich dir höchstens noch nennen, da du sequenzele blocks einliest, diese bearbeitest, udn das ganze in die Datei packst.
u könntest ein eigenes Dateisystem in der Datei nachbilden. Eine Datei hat in deiner spezifikation dann beispielsweise 512Byte blöcke. Willst du Daten einfügen, kannst du denneuen block ans ende hängen, udn im dateiheader deiner datei einene pointerliste der datenstruktur mitführen. Dadurch kannst du dann auch daten einfacher einfügen.
Aber ich schätze das das zu viel aufwand für dich ist, und du warscheinlich auch nciht mit codierten daten sondern mit klartext datein arbeiten willst .. oder?
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
MisterD

Anmeldungsdatum: 10.09.2004 Beiträge: 3071 Wohnort: bei Darmstadt
|
Verfasst am: 02.07.2009, 16:29 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | (unter win sind das max. 64KB pro Notepad) |
falsch man kann auch mehrere 100mb große dateien in notepad laden ... es dauert nur laaaaaange und das editieren danach ist laaaaangsam  _________________ "It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration."
Edsger W. Dijkstra |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 02.07.2009, 16:31 Titel: |
|
|
Ich meinte Win98. Sry. Wie das bei den anderen is, weis ich ned.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 02.07.2009, 16:49 Titel: |
|
|
St_W hat Folgendes geschrieben: | Wenn möglich, möchte ich eher plattformunabhängig bleiben. Gibts von FreeBasic da eine Möglichkeit? |
Es ist nunmal so, dass viele Funktionen auf mehreren Betriebssystemen existieren, aber anders heißen / Extrabibliotheken brauchen / etc. Was meinst du, wie viele #ifdef __FB_LINUX__-Befehle der FB-Source selbst enthält, hmm?  _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 02.07.2009, 17:01 Titel: |
|
|
Mein Programm ließt einige relevante Daten aus einer Datei mit vorgegebenem Dateiformat aus und legt diese Daten im RAM ab. Dort können sie auch vom Benutzer beliebig geändert werden.
Nachdem die Daten geändert wurden, soll die Datei aktualisiert werden. d.h. die bestehenden, für mein Programm unrelevanten Daten müssen von der alten Datei eingelesen werden, mit den neuen Daten aus dem RAM kombiniert werden und wieder in der alten Datei abgespeichert werden.
Einlesen der Daten mit OPEN FOR BINARY (was ich übrigens zu 90% verwende), ändern und zusammenstellen der neuen Datei im RAM (in Form eines mehrere MB großen Strings) funktioniert bereits ohne (bekannte ) Probleme.
Nur das schreiben des Strings in die Datei macht mir Probleme. Wenn die neuen Daten größer sind als die alten, ist das auch noch einfach: Man kann einfach die alte Datei öffnen, neue Daten hineinschreiben und fertig. Aber wenn die neuen Daten nicht mehr so groß sind wie die alten wäre die einzige Möglichkeit, die mir einfällt: Löschen und neu Erstellen.
Dies hat den Nachteil, dass z.B. das Dateidatum verloren geht und bei einem Programmabsturz nach dem Löschen und vor dem Schreiben die ganze Datei weg ist.
Die Sicherheit beim Speichern und Datenkonsistenz stehen bei mir auch nicht an erster Stelle. So wichtig sind die Daten auch nicht.
Gerne würde ich es so machen wie Notepad oder Wordpad - nur: wie funktioniert das in FB ? bzw. wie schaffen es die beiden z.B. das Datei-Erstelldatum beizubehalten und die Datei zu verkleinern?
__________________________________
@TPM, MisterD: Stimmt, unter Win98 kam noch das "Die Datei kann aufgrund ihrer Größe nicht mit Notepad geöffnet werden. Wollen Sie sie mit WordPad öffnen?". Aber bei neueren Windows Versionen ist das nicht mehr so. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Zuletzt bearbeitet von St_W am 02.07.2009, 18:17, insgesamt 3-mal bearbeitet |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 02.07.2009, 17:04 Titel: |
|
|
unter windows kannst du die grösse der "verkleinerten" datei via API verändern.
unter linux weis ich nicht, wie das geht.
Das dateidatum kann man auch via API manipulieren.
unter linux ist mir ebenfalls nich bekannt, wie man das da machen kann.
Die API's hab ich aber leider nicht im kopf. .. schau ma in der MSDN unter "createfile" .. da findest du sicher ne passende api .. irgend was mit filelenptr oder filepointer ...
edit
habs doch noch gefudnen ... is zwar VB, aber soltle kein problem sein das zu portieren.
http://www.freebasic-portal.de/index.php?s=fbporticula&mode=show&id=862
war mal ein VB projekt das RAR ähnlich arbeitet.
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 02.07.2009, 18:23 Titel: |
|
|
@TPM: Danke für den Beispielcode. Mit dem Programm kann ich zwar wenig anfangen (ist mir offensichtlich zu kompliziert), aber die in den ersten paar Zeilen Deklarieren Funktionen (von denen einige im ganzen Programm nie verwendet werden) klingen ganz interessant. Der Nachteil dabei ist natürlich, dass das Programm dann fix an Windows gebunden ist (was mir zwar ziemlich egal ist, da ich sowieso hauptsächlich mit Windows arbeite - aber Linux User können es dann nicht verwenden).
Ich werde mir jetzt den Quellcode von FBedit anschauen und hoffe, dass ich darin eine einfache Verwendung dieser (oder ähnlicher) Funktionen finde...
_________________________
@Jojo: Mit verschiedenen Bibliotheken unter Windows und Unix hab ich schon einmal gearbeitet (C# .NET Programm, dass unter Linux mit Mono läuft und auf einige Funktionen der POSIX Systembibliothek zugreift). Unter Windows ist das ja noch relativ einfach, weil es eine einheitliche API gibt, die wunderbar dokumentiert ist (MSDN-Library). Aber unter Linux kann man erstens nicht davon ausgehen, dass bestimmte Bibliotheken überhaupt installiert sind und die POSIX ist im Gegensatz zur Windows API erstens weit nicht so umfangreich vom Funktionsumfang und zweitens - im Gegensatz zur Windows API - sehr schlecht dokumentiert (und ich will mir nicht den Linux Quellcode anschauen, nur damit ich weiß was eine bestimmte Funktion tut bzw. wie man diese verwendet, weil es mir ja im Grunde egal ist, wie die Funktion programmiert ist. Ich will nur wissen, wie man sie Aufruft, was man zurückbekommt und wie/wo/wann man sie verwendet.) _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 02.07.2009, 20:25 Titel: |
|
|
Bei folgendem Code bleibt z.B. das Dateidatum (Erstelldatum) erhalten:
Code: | #include "windows.bi"
extern "windows" lib "kernel32"
#ifdef UNICODE
declare function ReplaceFile alias "ReplaceFileW" (lpReplacedFileName as LPCTSTR,lpReplacementFileName as LPCTSTR,lpBackupFileName as LPCTSTR,dwReplaceFlags as DWORD, lpExclude as LPVOID,lpReserved as LPVOID) as BOOL
#else
declare function ReplaceFile alias "ReplaceFileA" (lpReplacedFileName as LPCTSTR,lpReplacementFileName as LPCTSTR,lpBackupFileName as LPCTSTR,dwReplaceFlags as DWORD, lpExclude as LPVOID,lpReserved as LPVOID) as BOOL
#endif
end extern
ReplaceFile(@"original.txt", @"neu.txt", @"backup.txt", REPLACEFILE_WRITE_THROUGH, 0, 0) |
So kann man (wenn man zuerst die Funktion definiert, da ausgerechnet diese in der WinBase.bi wieder einmal fehlt) eine Originale Datei durch eine neue Ersetzen und von der Originaldatei eine Sicherung speichern. Wenn das Schreiben erfolgreich war, kann man dann das Backup löschen.
Ist diese Möglichkeit euer Meinung nach aus technischer Sicht her akzeptabel? (Nicht zu umständlich, langsam, etc.)
__________________________
FBedit verwendet übrigens soweit ich den Code in der Datei "fileIO.bas" verstanden habe folgende Methode:
Zuerst wird die Datei mit einer neuen leeren Datei überschrieben
CreateFile(szFileName,GENERIC_WRITE,FILE_SHARE_READ,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,0)
Und dann die Datei ganz normal beschrieben
WriteFile(hFile,hMem,nSize,@nSize,NULL) _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
 |
nemored

Anmeldungsdatum: 22.02.2007 Beiträge: 4704 Wohnort: ~/
|
Verfasst am: 02.07.2009, 20:47 Titel: |
|
|
Keine Ahnung, ob es sowas auch unter Windows gibt, aber unter Linux kannst du das Erstell- / Änderungsdatum mit touch (zurück-)ändern.
edit: hoppla, wohl nicht das Erstelldatum, sondern nur Änderungs- bzw. Zugriffsdatum. _________________ Deine Chance beträgt 1:1000. Also musst du folgendes tun: Vergiss die 1000 und konzentriere dich auf die 1. |
|
Nach oben |
|
 |
croco97

Anmeldungsdatum: 04.11.2005 Beiträge: 260
|
Verfasst am: 03.07.2009, 07:30 Titel: |
|
|
ThePuppetMaster hat Folgendes geschrieben: | Ich meinte Win98. Sry. Wie das bei den anderen is, weis ich ned.
MfG
TPM |
Stimmt auch nicht ganz. Du kannst problemlos den notepad eines NT/2000/XP auf Win98 einsetzen. (Würde ich dir auch empfehlen!). Dann hast du auch unter Win98 GB-Fähigkeit von notepad
VG! Croco |
|
Nach oben |
|
 |
ThePuppetMaster

Anmeldungsdatum: 18.02.2007 Beiträge: 1839 Wohnort: [JN58JR]
|
Verfasst am: 03.07.2009, 07:38 Titel: |
|
|
zu zeiten von 98 gabs noch kein XP .. wie soll man dann also das pad da einfügen?
abgesehen davon hab ich mi damals n eigenes gebastelt
MfG
TPM _________________ [ WebFBC ][ OPS ][ ToOFlo ][ Wiemann.TV ] |
|
Nach oben |
|
 |
Mao
Anmeldungsdatum: 25.09.2005 Beiträge: 4409 Wohnort: /dev/hda1
|
Verfasst am: 03.07.2009, 18:36 Titel: |
|
|
Alternativ lassen sich unter Windows auch alle Dateizeitstepmel über die API-Funktion SetFileTime() ändern. _________________ Eine handvoll Glück reicht nie für zwei.
--
 |
|
Nach oben |
|
 |
volta
Anmeldungsdatum: 04.05.2005 Beiträge: 1876 Wohnort: D59192
|
Verfasst am: 03.07.2009, 20:34 Titel: |
|
|
siehe: http://www.freebasic-portal.de/index.php?s=code&id=95 _________________ Warnung an Choleriker:
Dieser Beitrag kann Spuren von Ironie & Sarkasmus enthalten.
Zu Risiken & Nebenwirkungen fragen Sie Ihren Therapeuten oder Psychiater. |
|
Nach oben |
|
 |
St_W

Anmeldungsdatum: 22.07.2007 Beiträge: 956 Wohnort: Austria
|
Verfasst am: 04.07.2009, 16:37 Titel: |
|
|
Ich habe jetzt schon enige Methoden durchprobiert und stoße immer auf das selbe Problem:
Wenn die Datei mit irgend einem anderen Programm geöffnet ist, lässt sie sich nicht bearbeiten. Das es anders auch funktionieren muss, weiß ich, da ich z.B. eine Datei auch in FBedit und FBide gleichzeitig offen haben kann und einmal in FBedit, dann in FBide speichern kann. Bei FBedit kommt da sogar eine Meldung, dass die Datei außerhalb des Programmes verändert wurde.
Folgendes habe ich u.a. probiert:
Code: | hDatei = CreateFile(file, GENERIC_WRITE, FILE_SHARE_READ, 0, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0)
if hDatei = 0 then return 30
if WriteFile(hDatei, strptr(Datei), len(Datei), @Laenge, 0) = 0 then CloseHandle(hDatei): return 30
if Laenge <> len(Datei) then CloseHandle(hDatei): return 30
CloseHandle(hDatei)
open file for binary as DateiN
if err > 0 then close DateiN:return 22
put #DateiN, 1, Datei
close #DateiN
if ReplaceFile(strptr(file), strptr(TempDatei), 0, REPLACEFILE_WRITE_THROUGH, 0, 0) = 0 then return 30
|
Wie kann ich die Datei verändern, obwohl andere Programme die Datei geöffnet haben?
Wie kann ich die offenen Datei-Handles killen, wenn es dann trotzdem nicht funktioniert?
Wie merke ich, wenn die Datei von einem externen Programm geändert wurde?
//edit: Hab die betroffene Datei versehentlich mit einem Hex-Editor gleichzeitig geöffnet gehabt, der alle Schreibzugriffe geblockt hat. Wenn die Datei mit einem Texteditor (Notepad, Notepad++, FBedit, FBide, etc.) geöffnet ist, funktionierts jetzt. Somit hätte sich die erste Frage erledigt. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken)
Zuletzt bearbeitet von St_W am 04.07.2009, 17:04, insgesamt einmal bearbeitet |
|
Nach oben |
|
 |
Jojo alter Rang

Anmeldungsdatum: 12.02.2005 Beiträge: 9736 Wohnort: Neben der Festplatte
|
Verfasst am: 04.07.2009, 16:56 Titel: |
|
|
Dass Dateien gesperrt sind, wenn ein Programm sie geöffnet hat, ist eigentlich ziemlich normal...
http://vbnet.mvps.org/code/fileapi/watchedfolder.htm
schau mal hier (und dem verlinkten artikel), da soltlest du was zu notifications finden. _________________ » Die Mathematik wurde geschaffen, um Probleme zu lösen, die es nicht gäbe, wenn die Mathematik nicht erschaffen worden wäre.
 |
|
Nach oben |
|
 |
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|