Entwickler-Ecke

Dateizugriff - Dateien Verstecken


Mister Riös - Do 29.04.10 18:41
Titel: Dateien Verstecken
Hi, ich suche nach einer Möglichkeit Dateien eines beliebigen Dateityps zu verstecken und dennoch darauf zugreifen zu können.
Das Ganze sieht bei mir bis jetzt so aus (Beispiel):

Delphi-Quelltext
1:
2:
3:
4:
  AssignFile(Datei, name + '_Exist.HGS');
    ReWrite(Datei);
  //FileSetAttr(name + '_Exist.HGS', faHidden);    //Mein bisheriger Versuch
    CloseFile(Datei);


Was ich bis jetzt probiert hab, funktioniert zwar, aber ich kann später nicht mehr auf die versteckte Datei zugreifen, die Fehlermeldung sagt so viel wie "Dateizugriff verweigert". Der Programmteil oben erstellt die Datei, versteckt sie dann und schließt sie. An folgender Stelle tritt dann der Fehler auf:

Delphi-Quelltext
1:
2:
3:
4:
    AssignFile(Datei, name + '_Exist.HGS');
      ReSet(datei);                                //Hier 
      ReadLn(datei, SSL);
      CloseFile(Datei);


Irgendwelche Ideen?

Danke im Voraus!


Xentar - Do 29.04.10 18:47

Die Kürzel, die du an die Dateinamen hängst, sind unterschiedlich?


Mister Riös - Do 29.04.10 19:02

Oh, nein, Entschuldigung, ich greife auf mehrere Dateien zu und hab die Falsche Anweisungsfolge rauskopiert^^ Ich werd' es ändern


Dude566 - Do 29.04.10 19:55

Warum nicht vor dem zweiten Einlesen einfach die Attribute wieder zurücksetzen, und nach dem Lesen wieder setzen?


Mister Riös - Do 29.04.10 20:21

Wie geht das? Ich hab das bereits probiert, war mir aber nicht sicher mit welchem Befehl. Ich hab den gleichen genommen wie zum Verstecken und das ging nicht.


Delete - Do 29.04.10 20:41

Dir ist schon klar, dass das Augenwischerei ist? Ich habe den Explorer so eingestellt, dass er mir auch versteckte Dateien anzeigt. Was willst du damit bezwecken?


Mister Riös - Do 29.04.10 22:01

Das ist mir schon klar, aber für den ersten Blick reicht es wenn die Dateien "weg" sind. Das System auf dem mein Programm hauptsächlich ausgeführt wird ist derart beschränkt worden, es unterstützt nicht mal das Anzeigen von verstecktet Dateien (Außer man sucht explizit nach ihnen).


Mister Riös - Sa 01.05.10 22:14

Problem immer noch ungelöst.


jaenicke - Sa 01.05.10 23:38

Die versteckte Datei kann man ganz einfach mit SetFileAttributes [http://msdn.microsoft.com/en-us/library/aa365535(VS.85).aspx] wieder sichtbar machen.


Mister Riös - So 02.05.10 00:46

user profile iconjaenicke hat folgendes geschrieben Zum zitierten Posting springen:
Die versteckte Datei kann man ganz einfach mit SetFileAttributes [http://msdn.microsoft.com/en-us/library/aa365535(VS.85).aspx] wieder sichtbar machen.

Damit kann ich nichts anfangen.

Ich hab probiert, die Datei vor dem Zugriff wieder sichtbar zu machen:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
program Project1;

uses
  SysUtils;

{$APPTYPE CONSOLE}

var
  Datei:Textfile;
  h:string;

begin
  AssignFile(Datei, 'test.txt');
  ReWrite(Datei);
  FileSetAttr('test.txt', faHidden);
  CloseFile(Datei);

  readln(h);

  AssignFile(Datei, 'test.txt');
  ReSet(Datei);
  FileSetAttr('test.txt', faHidden);
  WriteLn(Datei, h);                              //Hier
  FileSetAttr('test.txt', faHidden);
  CloseFile(Datei);

end.


An der kommentierten Stelle kracht es 'E/A-Fehler 105'

Was mache ich falsch?


Xentar - So 02.05.10 00:55

Warum gehts du eigentlich diesen händischen Weg, mit AssignFile und so?
Geht doch auch einfacher, z.B. mit ner StringList.

Btw: Relative Dateipfade sind böse..


jaenicke - So 02.05.10 10:05

user profile iconMister Riös hat folgendes geschrieben Zum zitierten Posting springen:
Ich hab probiert, die Datei vor dem Zugriff wieder sichtbar zu machen:
Wo denn? :gruebel:
Du setzt doch nur überall das Attribut versteckt.

Wenn du es nicht mehr haben willst, dann darfst du es auch nicht als zu setzendes Attribut angeben:

Delphi-Quelltext
1:
  FileSetAttr(DateiInklPfad, 0);                    
Bzw. einmal komplett korrekt mit dem oben geposteten direkten API-Befehl (warum kannst du damit nichts anfangen :gruebel:):

Delphi-Quelltext
1:
2:
  SetFileAttributes(PChar(ExtractFilePath(ParamStr(0)) + 'test.txt'),
    GetFileAttributes(PChar(ExtractFilePath(ParamStr(0)) + 'test.txt')) and not FILE_ATTRIBUTE_HIDDEN);
So änderst du auch keine anderen Attribute, sondern entfernst nur dieses.
Auf den Zugriff hat das aber ohnehin keinen Einfluss welche Attribute da gesetzt sind. Das funktioniert auch bei versteckten Dateien.

Nur öffnest du die Datei zum Lesen (Reset) und versuchst dann da hinein zu schreiben, was erwartest du da anderes als einen Fehler? :autsch:
(Bei Binärdateien geht das mit Reset, bei Textdateien wie hier öffnet man diese aber nur zum Lesen, siehe Doku.)

Ja, dass die Pfadangabe fehlt, wurde ja bereits erwähnt, trotzdem einmal noch der Link inkl. Demo wo es schiefgeht:
http://www.delphi-library.de/viewtopic.php?p=499701