Avatar billede hermandsen Juniormester
01. november 2001 - 13:44 Der er 27 kommentarer og
2 løsninger

Reset en readonly-fil

Hej Eksperter

Hvordan \"Resætter\" jeg en fil der er readonly?

Koden er følgende:

procedure TForm1.MinProcedure(InputFile, OutputFile: String);
var
  FromFile, ToFile: file;
begin
  AssignFile(FromFile, InputFile);
  Reset(FromFile, 1);    //Her kommer fejlen!

  AssignFile(ToFile, OutputFile);
  Rewrite(ToFile, 1);

...
end;

Hvis FromF er readonly får jeg en I/O error og jeg kan ikke lave filen IKKE readonly. Hvad gør jeg så?
Avatar billede ziron Nybegynder
01. november 2001 - 13:47 #1
du vil sætte en fil til ikke readonly mere???

/ZIRON
Avatar billede ziron Nybegynder
01. november 2001 - 13:51 #2
brug koden:

SetFileAttributes(pchar(\'c:\\fil_du_vil_ændre.exe\'), FILE_ATTRIBUTE_NORMAL);


du kan se hvad du kan ændre til hvis du søger på SetFileAttributes i delphi hjælpen...

/ZIRON
Avatar billede hermandsen Juniormester
01. november 2001 - 13:56 #3
Hehe... Sorry, jeg tror jeg har skrevet lidt forkert... Jeg har en fil der er readonly, og den skal \"resættes\"
Jeg kan ikke sætte filen \"IKKE-READONLY\" Det er over lokalnetværk, så det er ikke muligt!
Avatar billede dkn Nybegynder
01. november 2001 - 14:00 #4
procedure TForm1.Button1Click(Sender: TObject);
Const
Filnavn=\'C:\\MinFile.txt\';
begin
if (FileGetAttr(Filnavn) and faReadOnly) > 0
then FileSetAttr(Filnavn, FileGetAttr(Filnavn) xor faReadOnly);
end;

Den checker først om filen skal gøes ikke skrive beskyttes, hvis den skal bliver den.
Avatar billede martinlind Nybegynder
01. november 2001 - 14:02 #5
Du kan evt. prøve med fileopen() den tager openmode parameter :

Constant    Definition

fmOpenRead    Open for read access only.
fmOpenWrite    Open for write access only.
fmOpenReadWrite    Open for read and write access.
fmShareCompat    Compatible with the way FCBs are opened.
fmShareExclusive    Read and write access is denied.
fmShareDenyWrite    Write access is denied.
fmShareDenyRead    Read access is denied.
fmShareDenyNone    Allows full access for others.
Avatar billede hermandsen Juniormester
01. november 2001 - 14:02 #6
Hvordan kan jeg gøre en fil der ligger på et lokalnetværk, \"Ikke-readonly\"?!? Så vidt jeg ved, er det ikke muligt, med mindre man laver nogle ikke helt lovlige tricks!
Avatar billede hermandsen Juniormester
01. november 2001 - 14:04 #7
Er FileOpen ikke kun til tekstfiler?
Avatar billede dkn Nybegynder
01. november 2001 - 14:04 #8
procedure TForm1.Button1Click(Sender: TObject);
Const
Filnavn=\'C:\\MinFile.txt\';
var
  FromFile, ToFile: file;
begin
if (FileGetAttr(Filnavn) and faReadOnly) > 0 then
Begin
  AssignFile(FromFile, InputFile);
  Reset(FromFile, 1);    //Her kommer fejlen!

  AssignFile(ToFile, OutputFile);
  Rewrite(ToFile, 1);
...
end else showmessage(\'File Is Read Only!\');
end;
Avatar billede hermandsen Juniormester
01. november 2001 - 14:05 #9
Jeg skal \"Seek\'e\" i filen, så den SKAL resættes på en eller anden måde!!!
Avatar billede hermandsen Juniormester
01. november 2001 - 14:06 #10
Det er ikke nok! Hvis filen er ReadOnly skal man da også kunne læse fra den!!!
Avatar billede martinlind Nybegynder
01. november 2001 - 14:08 #11
Der er normalt ikke nogle problemer med at læse fra en readonly fil som du prøver på i din kode, så det kunne jo være at Reset(,1); prøver at åbne med en filemode der er ReadWrite og den går jo ikke, derfor bruger du FileOpen i stedet for, for den kan du selv bestemme openmode på, eller hvis det bare er en kopi du vil lave kunne du overveje TFileStream / TMemoryStream i stedet for
Avatar billede hermandsen Juniormester
01. november 2001 - 14:12 #12
Så vidt jeg ved gør Reset(,1) det at den sætter en RecSize, som de selv kalder det. Det skulle så gerne være hvor meget der bliver læst fra filen af gangen...
Avatar billede martinlind Nybegynder
01. november 2001 - 14:13 #13
Du kunne jo overveje disse, hvis du ikke kan bruge Streams som er langt det nemeste :

FileOpen(), FileSeek(), FileRead();


Avatar billede hermandsen Juniormester
01. november 2001 - 14:15 #14
Hvad er det lige Streams det er? Og virker FileOpen(), FileSeek() FileRead() på binære filer?
Avatar billede martinlind Nybegynder
01. november 2001 - 14:18 #15
Ja, fra hjælpen : \" Opens a specified file using a specified access mode. \"

Streams er en Classe til at læse og skrive til div. ting f.eks. en fil eller memory, TFileStream.Create tager en openmode.
Avatar billede martinlind Nybegynder
01. november 2001 - 14:20 #16
Laver en kopi :

VAR
  FFra,FTil : TFileStream;
begin
  FFra := TFileStream.Create(\'MyInputFile\',fmOpenRead);
  FTil := TFileStream.Create(\'MyOutputFile\',fmCreate);
  FTil.CopyFrom(FFra,0);
  FTil.Free;
  FFra.Free;
end;
Avatar billede hermandsen Juniormester
01. november 2001 - 14:23 #17
Okay, jeg kigger på det! Thanks! :)
Avatar billede hermandsen Juniormester
01. november 2001 - 14:27 #18
Hvad gør CopyFrom(), og hvad gør den Longint i andet parameter?
Avatar billede martinlind Nybegynder
01. november 2001 - 14:29 #19
Kig lige i Hjælpen *S*, den Kopierer fra source streamen og 0 betyder fra starten.
Avatar billede unclebug Nybegynder
01. november 2001 - 14:30 #20
Delphi har en global variabel der hedder FileMode, og det er den mode der bruges når du åbner en fil. Default der read/write (2), derfor kan du ikke åbne filen. Hvis du sætter FileMode til 0 inden Reset, så kan du godt åbne den.
Avatar billede hermandsen Juniormester
01. november 2001 - 14:31 #21
Jah, okay... Det havde jeg sådan i store træk gættet, men andet parameter er det startstedet i bytes?
Avatar billede hermandsen Juniormester
01. november 2001 - 14:37 #22
Thanks Unclebug! Det virker sgu nu!!!
Avatar billede martinlind Nybegynder
01. november 2001 - 14:37 #23
Nej, Det er Count, du kan se det i hjælpen, men prøv du lige og se hvad unclebug skriver, det var lige det jeg ikke kunne huske *S*
Avatar billede hermandsen Juniormester
01. november 2001 - 14:37 #24
Tusind tak også til martinlind, jeg tror også jeg kan bruge noget af det du gav mig! :) Håber I er tilfredse med pointfordelingen!
Avatar billede martinlind Nybegynder
01. november 2001 - 14:40 #25
Ja, det er fint *S*
Avatar billede hermandsen Juniormester
02. november 2001 - 08:30 #26
Hey! Nu har jeg fået det til at virke, men jeg har lige et lille supplerende spørgsmål...

Hvis jeg skal Rewrite\'e en fil der eksisterer i forvejen, hvordan kan jeg så undgå at den fil jeg skal rewrite\'e til, ikke bliver slettet først??

Jeg skal bruge noget der minder om Append, men til binære filer. HJÆLP!!!
Avatar billede martinlind Nybegynder
02. november 2001 - 10:47 #27
Så laver man ikke en Rewrite, med en Reset og en Seek til enden af filen

/Martin
Avatar billede hermandsen Juniormester
02. november 2001 - 10:57 #28
Skal FileMode så sættes til WriteOnly, Read/Write eller er det fuldstændig ligemeget?
Avatar billede hermandsen Juniormester
02. november 2001 - 11:16 #29
Glem det! Har fået det til at virke! Thanks! :)
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