Autor Beitrag
TheLord
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Mi 12.11.03 17:43 
Irgendwie scheint FileSetAttr nicht bei allen win2k systemen zu funktionieren. Hat jemand ne Ahnung warum? Als Beispiel hab ich mal ein einfaches Programm aus irgendwelchen CodeBeispielen zusammengewürfelt ;)
ausblenden volle Höhe 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:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
61:
62:
63:
64:
65:
66:
67:
68:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Edit1: TEdit;
    Button1: TButton;
    Schreibschutz: TListBox;
    Edit2: TEdit;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  schs,i : integer;

implementation

{$R *.dfm}


procedure GetFilesInDirectory(ADirectory: string; AMask: String; AList: TStrings; ARekursiv: Boolean);
var
  SR2: TSearchRec;
begin
  if (ADirectory<>''and (ADirectory[length(ADirectory)]<>'\'then 
    ADirectory:=ADirectory+'\';

  if (FindFirst(ADirectory+AMask,faAnyFile-faDirectory,SR2)=0then begin
    repeat
      if (SR2.Name<>'.'and (SR2.Name<>'..'and (SR2.Attr<>faDirectory) then
          AList.Add(ADirectory+SR2.Name)
    until FindNext(SR2)<>0;
    Sysutils.FindClose(SR2);
  end;

  if ARekursiv then
    if (FindFirst(ADirectory+'*.*',faDirectory,SR2)=0then
    begin
      repeat
        if (SR2.Name<>'.'and (SR2.Name<>'..'then
          GetFilesInDirectory(ADirectory+SR2.Name,AMask,AList,True);
      until FindNext(SR2)<>0;
      Sysutils.FindClose(SR2);
    end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
GetFilesInDirectory(Edit1.Text,'*.*',Schreibschutz.Items,True);
for schs:=0 to ((Schreibschutz.Count)-1)
do
begin
Edit2.Text := Edit2.Text + ',' + InttoStr(FileSetAttr(Schreibschutz.Items.Strings[i],0));
end;
end;


end.

Ganz einfach. Und wenn er auf seinem Win2k Sys den ORdner angibt und auf den Button klickt, dann listet er in der ListBox alle Dateien richtig auf und gibt auch in Edit2 alle Werte von FileSetAttr als 0 (also hat es funktioniert) aus. Jedoch sind die Dateien immer noch schreibgeschützt.
Er hat SP4 und ist als Admin eingeloggt.

Bitte helft ich versteh es echt nicht...

Moderiert von user profile iconTino: Code- durch Delphi-Tags ersetzt.
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19335
Erhaltene Danke: 1751

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: Do 13.11.03 12:08 
Titel: Kleine Idee
Hallo!

Ich kann jetzt keine Tests machen :cry: , daher weiß ich nicht, ob das, was ich sage stimmt...

1. Lass Dir mal in einer Liste (z.B. in einem Memo) alle Dateinamen, die geändert wurden, noch einmal mit anzeigen und lass daneben jeweils mit FileGetAttr die (nach dem Setzen) neuen Attribute anzeigen. (Das sind einfache Integers)
Die Attribute müssten ja neu auf 0 stehen.

2. Es könnte gehen, wenn Du einfach nur faAnyFile als neues Attribut angibst oder die alten Attribute beibehälst und nur das Schreibschutz-Attribut wegnimmst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var a: String;
(...)
a:=Schreibschutz.Items.Strings[i];
If (FileGetAttr(a) and faReadOnly)<>0 then
  Edit2.Text := Edit2.Text + ',' + InttoStr(FileSetAttr(a,FileGetAttr(a) or not faReadOnly));


Hier wird, falls die Datei schreibgeschützt ist, das entsprechende Attribut entfernt. (hoffe ich :wink: , sonst muss es heißen:
ausblenden Delphi-Quelltext
1:
Edit2.Text := Edit2.Text + ',' + InttoStr(FileSetAttr(a,FileGetAttr(a) - faReadOnly));					
)

Alternativ wäre die Möglichkeit mit faAnyFile:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
var a: String;
(...)
a:=Schreibschutz.Items.Strings[i];
If (FileGetAttr(a) and faReadOnly)<>0 then
  Edit2.Text := Edit2.Text + ',' + InttoStr(FileSetAttr(a,faAnyFile));


Probier das mal aus, wenn das auch nicht geht, wüsste ich im Moment keine andere Erklärung.

(Es wäre aber total unsinnig, wenn "kein Attribut" nicht durch 0 darstellbar wäre, was ja eigentlich so funktionieren sollte...)

Viel Erfolg,
S.J.
TheLord Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 13.11.03 17:57 
Deine genannten Möglichkeiten funktionieren nicht mal bei mir...
Aber es is ja eigentl egal, ob ich das schreibschutzattrib wegnehm oder ob ich kein attribut setze...
Und das mit den attribs anzeigen is nicht so sinnvoll, da ich ja spätestens bei dem drüberkopieren einer datei feststelle ob es geklappt hat oder nicht, bzw bei klick im Explorer...
hat sonst noch jmd. eine Idee?