Autor Beitrag
DaKirsche
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Mi 16.07.08 07:52 
Hallo Community,

ich bastel mal wieder an meinem Desktop.ini Maker und will gerade folgende Funktion einbauen:

Auf Wunsch soll man rekursiv nach Unterverzeichnissen des gewählten Zielordners suchen und diese sollen dann je nach gewählter Option mit einer neuen Desktop.ini versehen werden oder jedoch vorhandene erweitert werden.

Soweit klappt das auch...zumindest beim ersten Durchlauf und nicht das Erweitern vorhandener Dateien.

Ich habe drei Funktionen für "erweitern", "ersetzen" und "nur Neu":
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:
69:
70:
71:
72:
73:
74:
75:
76:
77:
78:
79:
80:
81:
82:
83:
84:
85:
86:
87:
88:
89:
90:
91:
92:
93:
94:
95:
96:
97:
98:
99:
100:
101:
102:
103:
104:
105:
106:
107:
108:
109:
110:
111:
112:
113:
114:
115:
116:
117:
118:
119:
120:
121:
function updateDesktopiniFiles(TList: TStrings; aRootDirectory: String):boolean;
var xCnt: Integer;
    tmpini,tini2: TIniFile;
begin
  //Funktion, um rekursiv Ordner zu erstellen
  Form1.Label34.Caption:='wird initialisiern....Bitte warten!';
  Form1.RecPanel.Visible:=True;
  Form1.ProgressBar1.Max:= TList.Count;
  Form1.ProgressBar1.Position:=0;
  tini2:= TIniFile.Create(aRootDirectory+'Desktop.ini');
  for xCnt := 0 to TList.Count - 1 do
    begin
    Form1.Label34.Caption:=MinimizeName(TList[xCnt],Form1.Label34.Canvas,200);
    Application.ProcessMessages();
    Form1.ProgressBar1.Position:=xCnt;
      if not (FileExists(aRootDirectory+'Desktop.ini')) then
      begin
          tmpini:= TIniFile.Create(TList[xCnt]+'Desktop.ini');
        try
          with tmpini do
          begin
            if not (ValueExists('.ShellClassInfo','IconFile')) then writeString('.ShellClassInfo','IconFile',tini2.ReadString('.ShellClassInfo','IconFile',''));
            if not (ValueExists('.ShellClassInfo','IconIndex')) then writeInteger('.ShellClassInfo','IconIndex',tini2.ReadInteger('.ShellClassInfo','IconIndex',0));
            if not (ValueExists('.ShellClassInfo','InfoTip')) then writeString('.ShellClassInfo','InfoTip',tini2.ReadString('.ShellClassInfo','InfoTip',''));
            if not (ValueExists('ExtShellFolderViews','Default')) then writeString('ExtShellFolderViews','Default','{BE098140-A513-11D0-A3A4-00C04FD706EC}');
            if not (ValueExists('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Image')) then writeString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Image',tini2.ReadString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Image',''));
            if not (ValueExists('{BE098140-A513-11D0-A3A4-00C04FD706EC}','Attributes')) then writeInteger('{BE098140-A513-11D0-A3A4-00C04FD706EC}','Attributes',tini2.ReadInteger('{BE098140-A513-11D0-A3A4-00C04FD706EC}','Attributes',0));
            if not (ValueExists('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Text')) then writeString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Text',tini2.ReadString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Text',''));
          end;
        finally
        tmpini.UpdateFile;
          tmpini.Free;
        end;
        SetFileAttributes(PChar(Copy( PChar(TList[xCnt] + 'Desktop.ini'), 1,LastChar(TList[xCnt] + 'Desktop.ini''\')-1)), FILE_ATTRIBUTE_SYSTEM);
        SetFileAttributes(PChar(TList[xCnt] + 'Desktop.ini'),FILE_ATTRIBUTE_HIDDEN);
      end;
    end;
    tini2.Free;
    Form1.RecPanel.Visible:=False;
    ShowMessageDlgEx('rekursive Vererbung abgeschlossen','hierarchische Vererbung',101,mb_ok);
end;

function replaceDesktopiniFiles(TList: TStrings; aRootDirectory: String):boolean;
var xCnt: Integer;
    tmpini, tini2: TIniFile;
begin
  //Funktion, um rekursiv Ordner zu ersetzen
  Form1.Label34.Caption:='wird initialisiern....Bitte warten!';
  Form1.RecPanel.Visible:=True;
  Form1.ProgressBar1.Max:= TList.Count;
  Form1.ProgressBar1.Position:=0;
  tini2:= TIniFile.Create(aRootDirectory+'Desktop.ini');
  for xCnt := 0 to TList.Count - 1 do
    begin
    Form1.Label34.Caption:=MinimizeName(TList[xCnt],Form1.Label34.Canvas,200);
      Application.ProcessMessages();
      Form1.ProgressBar1.Position:=xCnt;
     tmpini:= TIniFile.Create(TList[xCnt]+'Desktop.ini');
        try
          with tmpini do
          begin
            writeString('.ShellClassInfo','IconFile',tini2.ReadString('.ShellClassInfo','IconFile',''));
            writeInteger('.ShellClassInfo','IconIndex',tini2.ReadInteger('.ShellClassInfo','IconIndex',0));
            writeString('.ShellClassInfo','InfoTip',tini2.ReadString('.ShellClassInfo','InfoTip',''));
            writeString('ExtShellFolderViews','Default','{BE098140-A513-11D0-A3A4-00C04FD706EC}');
            writeString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Image',tini2.ReadString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Image',''));
            writeInteger('{BE098140-A513-11D0-A3A4-00C04FD706EC}','Attributes',tini2.ReadInteger('{BE098140-A513-11D0-A3A4-00C04FD706EC}','Attributes',0));
            writeString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Text',tini2.ReadString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Text',''));
          end;
        finally
        tmpini.UpdateFile;
          tmpini.Free;
        end;
        SetFileAttributes(PChar(Copy( PChar(TList[xCnt] + 'Desktop.ini'), 1,LastChar(TList[xCnt] + 'Desktop.ini''\')-1)), FILE_ATTRIBUTE_SYSTEM);
        SetFileAttributes(PChar(TList[xCnt] + 'Desktop.ini'),FILE_ATTRIBUTE_HIDDEN);
      end;
    Form1.RecPanel.Visible:=False;
    ShowMessageDlgEx('rekursive Vererbung abgeschlossen','hierarchische Vererbung',101,mb_ok);
end;

function createNewDesktopiniFiles(TList: TStrings; aRootDirectory: String):boolean;
var xCnt: Integer;
    tmpini,tini2: TIniFile;
begin
  //Funktion, um rekursiv Ordner zu erstellen
  Form1.Label34.Caption:='wird initialisiern....Bitte warten!';
  Form1.RecPanel.Visible:=True;
  Form1.ProgressBar1.Max:= TList.Count;
  Form1.ProgressBar1.Position:=0;
  tini2:= TIniFile.Create(aRootDirectory+'Desktop.ini');
  for xCnt := 0 to TList.Count - 1 do
    begin
    Form1.Label34.Caption:=MinimizeName(TList[xCnt],Form1.Label34.Canvas,200);
    Application.ProcessMessages();
    Form1.ProgressBar1.Position:=xCnt;
      if not (FileExists(aRootDirectory+'Desktop.ini')) then
      begin
          tmpini:= TIniFile.Create(TList[xCnt]+'Desktop.ini');
        try
          with tmpini do
          begin
            writeString('.ShellClassInfo','IconFile',tini2.ReadString('.ShellClassInfo','IconFile',''));
            writeInteger('.ShellClassInfo','IconIndex',tini2.ReadInteger('.ShellClassInfo','IconIndex',0));
            writeString('.ShellClassInfo','InfoTip',tini2.ReadString('.ShellClassInfo','InfoTip',''));
            writeString('ExtShellFolderViews','Default','{BE098140-A513-11D0-A3A4-00C04FD706EC}');
            writeString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Image',tini2.ReadString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Image',''));
            writeInteger('{BE098140-A513-11D0-A3A4-00C04FD706EC}','Attributes',tini2.ReadInteger('{BE098140-A513-11D0-A3A4-00C04FD706EC}','Attributes',0));
            writeString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Text',tini2.ReadString('{BE098140-A513-11D0-A3A4-00C04FD706EC}','IconArea_Text',''));
          end;
        finally
        tmpini.UpdateFile;
          tmpini.Free;
        end;
        SetFileAttributes(PChar(Copy( PChar(TList[xCnt] + 'Desktop.ini'), 1,LastChar(TList[xCnt] + 'Desktop.ini''\')-1)), FILE_ATTRIBUTE_SYSTEM);
        SetFileAttributes(PChar(TList[xCnt] + 'Desktop.ini'),FILE_ATTRIBUTE_HIDDEN);
      end;
    end;
    tini2.Free;
    Form1.RecPanel.Visible:=False;
    ShowMessageDlgEx('rekursive Vererbung abgeschlossen','hierarchische Vererbung',101,mb_ok);
end;


Vom Prinzip sind alle drei gleich, nur dass die entsprechenden Abfragen eingebaut sind, ob eine Datei besteht (nur Neu) oder ob der entsprechende Eintrag bereits besteht (erweitern).

Das Problem, was ich jetzt habe liegt in dem Durchsuchen des Ordners nach Unterordnern:
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:
procedure TForm1.Button1Click(Sender: TObject);
var Ergebnis: TStrings;
[...]
begin
[...]
if (CheckBox1.Checked) then
begin
 if ShowMessageDlgEx('Sind Sie sicher, dass Sie die vorgenommenen Einstellungen auf alle Unterordner übernehmen wollen? Dies kann u.U. einige Zeit dauern!','hierarchische Vererbung der Desktop.ini Einstellungen',101,MB_YESNO)=IDYES then
 begin
   ListBox1.Clear;
   Ergebnis:= TStrings.Create();
   SetDesktIniSubDirs(sUsedDirectory,Ergebnis);
   if (ListBox1.Items.Count > 0then
   begin
    if RadioButton1.Checked then updateDesktopiniFiles(ListBox1.Items,sUsedDirectory)           //aktualisieren
    else if RadioButton2.Checked then replaceDesktopiniFiles(ListBox1.Items,sUsedDirectory)     //ersetzen
    else if RadioButton3.Checked then createNewDesktopiniFiles(ListBox1.Items,sUsedDirectory)   //nur Neu
   end
   else
    ShowMessageDlgEx('Es wurden keine Unterverzeichnisse gefunden. Bitte führen Sie den Vorgang erneut aus!','hierarchische Vererbung',101,mb_ok);
 end else
   ShowMessageDlgEx('Die hierarchische Vererbung wurde abgebrochen!','hierarchische Vererbung abgebrochen!',101,mb_OK);
end;
[...]
end;

procedure TForm1.SetDesktIniSubDirs(D_Path: string; Ergebnis: TStrings);
var sr: TSearchRec;
begin
    if FindFirst(D_Path + '*.*', faDirectory, SR) = 0 then try
      repeat
        if ((SR.attr and faDirectory) = faDirectoryand
           (SR.Name <> '.'and (SR.Name <> '..'then begin
              SetDesktIniSubDirs(D_Path + SR.Name + '\', Ergebnis);
              Listbox1.Items.Add(D_Path + SR.name+'\');
           end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;  
end;


Ich übergebe zwar die Variable Ergebnis, aber nutze die nicht, weil sich dann das Programm aufgehängt hat und bin zu Testzwecken auf eine Listbox umgestiegen.

Da ich die Verzeichnisse zum Systemverzeichnis benenne findet er beim nächsten Durchlauf den Ordner nicht mehr...das ist jedoch ein Problem, wenn es um die erweiterung geht. Ausserdem wird der Ordner dann in den DirectoryListBox-Komponenten nicht mehr angezeigt.

Was muss ich machen, damit die Ordner trotzdem erkannt werden?
Solange ich die Ordner nicht mit dem Systemattribut versehe werden die Änderungen der Desktop.ini-Datei nicht angezeigt.

Schonmal Danke für die Hilfe!
Mfg
DaKirsche

_________________
Die simpelsten Fehler sind meist die Schwersten...
DaKirsche Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Do 17.07.08 10:14 
kann mir jemand sagen, wie ich die Verzeichnisse herausfinde, die mit dem Systemattribut versehen wurden?
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.SetDesktIniSubDirs(D_Path: string; Ergebnis: TStrings);
var sr: TSearchRec;
begin
    if FindFirst(D_Path + '*.*', faDirectory, SR) = 0 then try
      repeat
        if ((SR.attr and faDirectory) = faDirectory) and
           (SR.Name <> '.'and (SR.Name <> '..'then begin
              SetDesktIniSubDirs(D_Path + SR.Name + '\', Ergebnis);
              Listbox1.Items.Add(D_Path + SR.name+'\');
           end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;  
end;


Damit suche ich derzeit nach Verzeichnissen und es scheitert daran, dass diese nach dem ersten Durchgang mit dem FILE_ATTRIBUTE_SYSTEM versehen werden. Ich müsste diese jedoch wieder finden, um in diesen ORdner Änderungen durchzuführen.

Kann mir das jemand sagen? Danke schonmal!

_________________
Die simpelsten Fehler sind meist die Schwersten...
Martin1966
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 1068

Win 2000, Win XP
Delphi 7, Delphi 2005
BeitragVerfasst: Do 17.07.08 10:19 
Vielleicht klappt ja das:

ausblenden Delphi-Quelltext
1:
if FindFirst(D_Path + '*.*', faDirectory + faSysFile , SR) = 0 then try					

_________________
Ein Nutzer der Ecke ;-)
DaKirsche Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 187

Win XP Pro, SuSe Linux 7.3 - 10.2, Win 2k3 Server, Win 2000, Win NT 4.0
Delphi 2006 Pro, Java, HTML, SQL, PHP, CSS
BeitragVerfasst: Do 17.07.08 11:43 
klappt....danke:)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
procedure TForm1.SetDesktIniSubDirs(D_Path: string; Ergebnis: TStrings);
var sr: TSearchRec;
begin
    if FindFirst(D_Path + '*.*', faDirectory+faSysFile, SR) = 0 then try
      repeat
        if ((SR.attr and faDirectory+faSysFile) = (faDirectory+faSysFile)) and
           (SR.Name <> '.'and (SR.Name <> '..'then begin
              SetDesktIniSubDirs(D_Path + SR.Name + '\', Ergebnis);
              Listbox1.Items.Add(D_Path + SR.name+'\');
           end;
      until FindNext(SR) <> 0;
    finally
      FindClose(SR);
    end;  
end;

_________________
Die simpelsten Fehler sind meist die Schwersten...
goCM
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 18



BeitragVerfasst: Fr 22.08.08 13:19 
Müsste es nicht so sein ?

ausblenden Delphi-Quelltext
1:
2:
3:
4:
...
              SetDesktIniSubDirs(D_Path + SR.Name + '\', Ergebnis);
              Listbox1.Items.Add(D_Path +'\');
 ...
[/quote]

Der Ordnername würde sich ansonsten verdoppeln:
Aus Windows\Fonts\ wird Windows\FontsFonts\