Entwickler-Ecke

Dateizugriff - Windows 7 und Ini Files, Pfad ist richtig, unable to create


moonraker - Di 19.07.11 13:21
Titel: Windows 7 und Ini Files, Pfad ist richtig, unable to create
Hallo Leute,

Hab ein Delphi 5 Programm zum warten.
Dieses speichert ein Projektfile als ini File mittels TInifile componente.
Nur die Endung ist anders.
Nun stellte das bis anhin kein Problem dar, auch nicht auf Windows 7 bzw Vista.
Jetzt hab ich einen W7 Rechner der mir unregelmässig verweigert das File zu erstellen (Create) oder upzudaten (TmemInifile.update).
Meldet entweder zuwenig Rechte- wenden sie sich an den admin , oder exceptuion unalbe to create.
Nun hab ich als der User aber vollzugriff auf den Ordner (das selbe File mit editor kann ich nach belkieben ändern, speichern usw)
Gespeichert wird auf dem Dokumentepfad in einem Unterordner der bei Installation angelegt wird.
Habt Ihr Tipps was da los sein könnte? Langsam gehen mir die Ideen aus.
Bin für alle Tipps dankbar.


acnut - Di 19.07.11 13:29

hab die gleichen probleme mit den ini-dateien auch gehabt und mir wurde folgendes empfohlen:

http://www.delphi-library.de/viewtopic.php?p=548600


moonraker - Di 19.07.11 14:05

hallo acnut,
nein diesmal ist es nicht das klassische Problem dass ich keien Rechte hab.
Zumindest sollte ich sie haben, da ich das File in die eigenen Dokumente schreib.
auch die Optionen oder anderen Inis sind dort wo sie hingehören (%APPDATA% usw...)


jaenicke - Di 19.07.11 14:19

Du könntest einmal mit dem Process Monitor die Zugriffe loggen und dann schauen was dort passiert ist.

Relative Pfade hast du sicher nirgends mehr?


moonraker - Di 19.07.11 15:33

hallo,

nein, auf jeden fall nicht mehr in diesem bereich wo es mich ärgert.
hab mir auch die aktuellen pfade zur sicherheit anzeigen lassen.
Offline Dateien deaktiviern ändert ein wenig die Fehlerhäufigkeit wies scheint ??


turboPASCAL - Di 19.07.11 15:35

mach doch mal 'n Test mit AssignFile() und las dir das IOResult() zurückgeben.

Oder einfach mal Testen:


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:
program Testme;

{$APPTYPE CONSOLE}

uses
  Windows,
  Inifiles,
  SysUtils,
  ShellAPI,
  ActiveX,
  ShlObj;

function GetSpecialFolder (CSIDL: Integer) : String;
var
  ItemIDList: PItemIDList;
  sFolderPath : String;
  iSystemFolder : Integer;
  pMalloc : IMalloc;
begin
  pMalloc := nil;
  sFolderPath := '';
  SHGetMalloc (pMalloc);
  if (pMalloc = nil)
    then begin
      Exit;
    end;
  try
    iSystemFolder := CSIDL;
    if (SUCCEEDED (SHGetSpecialFolderLocation (0, iSystemFolder, ItemIDList)))
      then begin
        SetLength (sFolderPath, MAX_PATH);
        if (SHGetPathFromIDList(ItemIDList, PChar(sFolderPath)))
          then begin
            SetLength (sFolderPath, Length(PChar(sFolderPath)));
          end;
      end;
  finally
    Result := sFolderPath;
    pMalloc.Free(ItemIDList);
  end;
end;

var
  myDocPath: string;
  myFilePath: string;

begin
  myDocPath := GetSpecialFolder(CSIDL_PERSONAL);

  if myDocPath <> '' then
  begin
    writeln(myDocPath);

    myFilePath := myDocPath + '\Test.cfg';
    writeln(myFilePath);

    if DirectoryExists(myDocPath) then
    begin
      with TInifile.Create(myFilePath) do
      try
        WriteString('Testsection''Test''Test123');
        writeln('write to Inifile...');
      finally
        Free;
      end;

    end else
    begin
      // Upps, Path existiert nicht
      writeln('Path existiert nicht !');
    end;

  end else
  begin
    // Upps, Path leer
    writeln('Path ist leer !');
  end;

  writeln('done.');
  readln;
end.