Page 1 of 2 1 2 LastLast
Results 1 to 15 of 18

Thread: Cannot create file: TMemIniFile.UpdateFile

  1. #1

    Cannot create file: TMemIniFile.UpdateFile

    Goedemiddag beste toppers.
    Ik zit met iets en vind dit vreemd.

    exception class : EFCreateError
    exception message : Cannot create file "C:\Users\Jan\AppData\Roaming\FinalPlayer\Effects. ini". Het systeem kan het opgegeven pad niet vinden.
    00589ed7 +043 FinalPlayer.exe System.IniFiles 906 +4 TMemIniFile.UpdateFile ???

    Helaas is dit niet bij mij en vraag me af waarom.

    Code:
    procedure SaveEffectItemsData;
    var
      EffectCount: Integer;
      ASection: string;
      Effect: TFinalEffectRecType;
      IniEffects: TMemIniFile;
    
      procedure DoSaveEffects;
      var
        Index: Integer;
      begin
        IniEffects.Clear;
        with IniEffects do
        begin
          { Effecten }
          EffectCount := FinalEffectBase.Count;
          WriteInteger('Effect', 'Count', EffectCount);
          for Index := 0 to Pred(EffectCount) do
          begin
            ASection := 'Effect ' + Format('%.3d', [Index + 1]);
            Effect := FinalEffectBase.GetRecord(Index);
            WriteBool(ASection, 'Enabled', Effect.EffectRec.Enabled);
            WriteInteger(ASection, 'Group', Effect.EffectRec.Group);
            WriteString(ASection, 'Caption', Effect.EffectRec.Caption);
            WriteString(ASection, 'FilePath', Effect.EffectRec.FilePath);
            WriteString(ASection, 'Hint', Effect.EffectRec.Hint);
            WriteString(ASection, 'ShortCap', Effect.EffectRec.ShortCap);
            WriteInteger(ASection, 'Duration', Effect.EffectRec.Duration);
            WriteBool(ASection, 'ShortCut', Effect.ShortCut.Enabled);
            WriteBool(ASection, 'Partymode', Effect.ShortCut.State._Partymode);
            WriteInteger(ASection, 'KeyState', Effect.ShortCut.State.KeyState);
            WriteBool(ASection, 'Shift', Effect.ShortCut.State.Shift);
            WriteBool(ASection, 'Ctrl', Effect.ShortCut.State.Ctrl);
            WriteBool(ASection, 'Alt', Effect.ShortCut.State.Alt);
          end;
          { Groepen }
          for Index := 0 to Pred(MAX_GROUP_EFFECT) do
          begin
            WriteBool('Group ' + Format('%.1d', [Index]), 'Enabled', EffectGroupRec[Index].Enabled);
            WriteString('Group ' + Format('%.1d', [Index]), 'Caption',  EffectGroupRec[Index].Caption);
          end;
        end;
        IniEffects.UpdateFile;
      end;
    
    begin
      IniEffects := TMemIniFile.Create(AddBS(MainFolderPath) + __DEFAULT_EFFECTEN, TEncoding.Unicode);
      _AddLog(_ReportLog, 'SaveEffectData: ' + IniEffects.FileName);
      try
        try
          DoSaveEffects;
        except
          _AddLog(_ErrorLog, 'SaveEffectData Exception: Cannot create file ' + AddQuotes(IniEffects.FileName));
        end;
      finally
        IniEffects.Free;
      end;
    end;
    Deze routine wordt aangeroepen bij afsluiten programma.

    Dit werkt goed en is zeldzaam dat dit gebeurd. Kan mij niet de indruk wekken dat opeens de IniEffects.UpdateFile; niet meer werkt.
    Deze gebruiker ken ik niet en is niet zinvol dan iemand daarmee te confronteren.

    Komt dus vanuit 'madCollection' vandaar ik nu een extra Try gedaan hebt. Scheelt gedoe maar lost het niet op denk ik.

    Bedankt alvast.
    Groetjes,
    Eduard.

  2. #2
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik dacht eerst: "Oh, lees/schrijfrechten probleem", totdat ik zag dat jij zelf een exception logt als "Cannot create file".

    Verander eens dit van:
    Delphi Code:
    1. except
    2.   _AddLog(_ErrorLog, 'SaveEffectData Exception: Cannot create file ' + AddQuotes(IniEffects.FileName));
    3. end;
    naar:
    Delphi Code:
    1. except
    2.   on E: Exception do
    3.     _AddLog(_ErrorLog, 'SaveEffectData Exception: "' + E.Message + '" ' + AddQuotes(IniEffects.FileName));
    4. end;
    zodat je de echte exception melding te zien krijgt.
    TMemoryLeak.Create(Nil);

  3. #3
    Gaat niet werken want is probleem dat opeens de map niet bestaat in Windows. Werkt dus 99% goed alleen op bepaalde pc's niet.
    Kan het niet zo zijn dat dit een andere probleem is. Rechten?
    De echte Exception komt dus 99,9% nooit.

  4. #4
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    De E: Exception...E.Message *zou* de exacte reden van het probleem moeten geven (alleen nu weten we die niet, omdat jij hard "Cannot create file" als fout opgeeft, maar dat is het gevolg, niet de oorzaak).

    Als ik mij goed herinner wordt "AppData\Roaming" gebruikt voor gebruikers die van PC kunnen wisselen, dus hun instellingen/temp-bestanden meenemen zodra ze ergens inloggen op hetzelfde domein.
    Stel dus dat, in theorie, Jan eerst op PC1 zit en vervolgens inlogd op PC2 (en dus wordt afgemeld van PC1), dan wordt de Roaming map verwijderd op PC1 en verplaatst naar PC2.

    Aangezien ik hier zelf eigenlijk maar weinig mee werk (instellingen worden opgeslagen in een database en niet lokaal) heb ik er verder weinig ervaring mee.
    Maar zoals altijd hier op NLDelphi zijn er een heleboel knappe koppen die misschien wel precies weten hoe de vork aan de steel zit.
    TMemoryLeak.Create(Nil);

  5. #5
    Zit wat in. De Roaming map wordt gebruikt door de installatie versie. Bij het afsluiten zou het kunnen dat de gebruiker wisselt en het niet werkt?
    Dan zou dus de regel:
    begin
    IniEffects := TMemIniFile.Create(AddBS(MainFolderPath) + __DEFAULT_EFFECTEN, TEncoding.Unicode);
    {}
    end;
    Ook moeten falen?
    Het blijft een gok element.
    Exception blijft gewoon:
    exception message : Cannot create file "C:\Users\Jan\AppData\Roaming\FinalPlayer\Effe cts. ini". Het systeem kan het opgegeven pad niet vinden.

  6. #6
    Sommige dingen in W10 blijven soms en vaak problematisch :-)

  7. #7
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Hmmm, welke Delphi versie gebruik jij?

    Ik zit even in de VCL source te kijken (van D10.3.3) en daarin zie ik dat TMemIniFile een directe afgeleide is van TCustomIniFile.
    TCustomIniFile heeft een method "UpdateFile", maar in TCustomIniFile is deze virtual en abstract (dus niet geïmplementeerd) en in TMemIniFile wordt deze niet geïmplementeerd.

    Dus... dan zou dit toch helemaal niet moeten werken? (een TMemIniFile is in mijn optiek alleen voor in het geheugen en niet voor op schijf, zoals bijvoorbeeld een normale TIniFile).


    Of ik heb gewoon weer te lang gewerkt vandaag en moet even een frisse neus halen en ik zie het gewoon verkeerd.
    Last edited by VideoRipper; 25-Jan-21 at 18:28.
    TMemoryLeak.Create(Nil);

  8. #8
    volgens mij is de vraag hoe "__DEFAULT_EFFECTEN" en "AddBS(MainFolderPath)" tot de naam van die folder komen, oftewel maakt de applicatie gebruik van bijv GetSpecialFolderPath en CSIDL_COMMON_APPDATA of CSIDL_APPDATA of wordt deze directory "verzonnen"

  9. #9
    Delphi 10.2.
    Klopt allemaal Miep. En ja VideoRipper ik snap je. Dit is ook meer een incident en komt nooit voor.
    Het komt allemaal hier terecht.

    (unit System.Classes)

    Code:
    procedure TStrings.SaveToFile(const FileName: string; Encoding: TEncoding);
    var
      Stream: TStream;
    begin
      Stream := TFileStream.Create(FileName, fmCreate);
      try
        SaveToStream(Stream, Encoding);
      finally
        Stream.Free;
      end;
    end;
    Lijkt mij dus een toeval treffer. Maar vandaar de vraag waarom :-)

  10. #10
    exception message : Cannot create file "C:\Users\Jan\AppData\Roaming\FinalPlayer\Effe cts. ini". Het systeem kan het opgegeven pad niet vinden.
    Het lijkt alsof er een spatie in je path zit?Of is dat erin geslopen tijdens het schrijven van het topic?

  11. #11
    Quote Originally Posted by DragonFly View Post
    Klopt allemaal Miep.
    Geen idee welk deel er klopt, Dat "verzonnen" of dat deel van "GetSpecialFolderPath "

    De opmerking van [VideoRipper] is de beste oplossing om te kijken wat de echte foutmelding is. Door de Windows error code te kennen weet je direct wat het probleem echt is.

    Daarnaast zijn er nogal wat bedrijven (zeker de overheid) die de toegang tot die folder afschermen voor software als die software niet expliciet door systeembeheer goedgekeurd is. Dit om het zelf downloaden van software en installeren tegen te gaan.

  12. #12
    Fornicatorus Formicidae VideoRipper's Avatar
    Join Date
    Mar 2005
    Location
    Vicus Saltus Orientalem
    Posts
    5,708
    Ik had inderdaad even een nacht slaap nodig: UpdateFile() is natuurlijk wél geïmplementeerd in TMemIniFile (het staat gewoon onder de private type declaratie).

    Die spatie op het forum zet het forum er zelf tussen: vraag me niet waarom, maar ik heb mij daar ook eens op verkeken.

    Zelf "Verzonnen" systeempaden mag je nooit gebruiken en volgens mijn doet DragonFly dat ook niet (maar dat zou hij uitsluitsel over moeten geven); dat zou ook niet echt verklaren waarom het soms niet werkt en meestal wel.
    TMemoryLeak.Create(Nil);

  13. #13
    Luigi: Path + Filename is gewoon goed. Denk met typen of plakken er iets weg valt.

    Miep: Gewoon via CSIDL_APPDATA bij de start programma. Zal 'on E: Exception do' eens toevoegen bij alle INI schrijfroutines want er zijn er meer.

    Nogmaals gaat gewoon 99,99999999% goed vandaar de vraag. Er wordt namelijk veel geschreven in de Roaming map.
    Zat al te denken aan een virtuele omgeving die eerder wordt gestopt dan het programma kan eindigen.

  14. #14
    Klopt VideoRipper. Ik zal overal de Except opvangen dan krijgen de gebruikers in ieder geval geen eng 'madCollection' scherm meer en ik geen Bugreport in mn email :-)

  15. #15
    Quote Originally Posted by VideoRipper View Post
    dat zou ook niet echt verklaren waarom het soms niet werkt en meestal wel.
    ik las dat als, bij sommige gebruikers werkt het wel en bij andere niet. Niet als het werkt bij dezelfde gebruiker soms wel soms niet.

Page 1 of 2 1 2 LastLast

Thread Information

Users Browsing this Thread

There are currently 1 users browsing this thread. (0 members and 1 guests)

Bookmarks

Posting Permissions

  • You may not post new threads
  • You may not post replies
  • You may not post attachments
  • You may not edit your posts
  •