Page 2 of 2 FirstFirst 1 2
Results 16 to 23 of 23

Thread: Create directory op netwerk share

  1. #16
    Monitoren met sysinternals zal niet zoveel opleveren. Het 'probleem' zit in principe op de NAS (wat ook blijkt aan het feit dat een kleine sleep het probleem oplost).

    Ik zou het met een kleine loop oplossen die controleert of de directory nog bestaat en na een timeout pas doorloopt. Een sleep(1000) geeft n.l. ALTIJD een vertraging van 1 seconden terwijl dat lang niet altijd nodig is.

    Zoiets:
    Delphi Code:
    1. function DeleteFolders(Path: String): boolean;
    2. var
    3.   StartTime: dword;
    4. begin
    5.   Result := False;
    6.   try
    7.     TDirectory.Delete(Path, True);
    8.  
    9.     // dit is de nieuwe loop i.p.v. een sleep(1000)
    10.     StartTime := GetTickCount;
    11.     while DirectoryExists(Path) and (GetTickCount < StartTime + 1000) do
    12.       Sleep(20);
    13.  
    14.     if DirectoryExists(Path) then
    15.     begin
    16.       Logger(Format('Error cleaning up %s. Remove folder before continue', [Path]), etError);
    17.       Result := False;
    18.     end
    19.     else
    20.     begin
    21.       Logger(Format('Cleaning up %s succesful.', [Path]), etNormal);
    22.       Result := True;
    23.     end
    24.   except
    25.     on E: Exception do
    26.     begin
    27.       Logger(Format('Error cleaning up %s', [Path]), etError);
    28.       Logger(Format('System Error Message: %s', [SysErrorMessage(GetLastError)]), etError);
    29.       Logger(Format('Exception Message: %s', [E.Message]), etError);
    30.     end;
    31.   end;
    32. end;

  2. #17
    mov rax,marcov; push rax marcov's Avatar
    Join Date
    Apr 2004
    Location
    Ehv, Nl
    Posts
    9,778
    In de problemen die ik had, zou delete() een exceptie gooien, en wordt er dus niet meermaals geprobeerd.

  3. #18
    Je kunt rond de TDirectory.Delete() natuurlijk ook wel een loop zetten indien er een exception komt. Maar voor het probleem zoals hier zou ik dat absoluut niet doen en de loop die ik liet zien intact laten. Want hier is het echt dat de Delete() wel werkt (en geen exception geeft) maar niet direct uitgevoerd wordt. Als je er dan gelijk nog een keer een Delete() overheen gaat gooien kun je daardoor ook weer exceptions ontvangen.

    Maar zoiets kan natuurlijk ook:

    Delphi Code:
    1. repeat
    2.   Nogmaals := false;
    3.   try
    4.     TDirectory.Delete(Path, True);
    5.   except
    6.     on E: EBepaaldeException do
    7.     begin
    8.       Sleep(1000);
    9.       Nogmaals := true;
    10.     end;
    11.   end;
    12. until not Nogmaals;
    13.  
    14. // dit is de nieuwe loop i.p.v. een sleep(1000)
    15. StartTime := GetTickCount;
    16. while DirectoryExists(Path) and (GetTickCount < StartTime + 1000) do
    17.   Sleep(20);

    (en misschien voor EBepaaldeException ook een timeout inbouwen)

  4. #19
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    149
    ik zal bovenstaande code eens proberen. Heb ook al de SMB logging aangezet maar daar staat nog nks in.

  5. #20
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    149
    100x gedraaid, 1x failed met delete.
    Ook de delay al op 5000 gezet.

    First chance exception at $74BF17D2. Exception class EDirectoryNotFoundException with message 'The specified path was not found'. Process CreateFolders.exe (11912)

    [ 84]
    Creating Z:\PROJECTS\POItool\TST\CreateFolders\Win32\Debug\ OUTPUT\TEST [Succes]
    Error cleaning up Z:\PROJECTS\POItool\TST\CreateFolders\Win32\Debug\ OUTPUT\TEST. Remove folder before continue

    [ 85]
    Creating Z:\PROJECTS\POItool\TST\CreateFolders\Win32\Debug\ OUTPUT\TEST [Succes]
    Error cleaning up Z:\PROJECTS\POItool\TST\CreateFolders\Win32\Debug\ OUTPUT\TEST
    System Error Message: The handle is invalid
    Exception Message: The specified path was not found

  6. #21
    Als je de samba config aan kunt passen kun je ook nog andere tweak standen proberen. (Meestal heb je die config niet in de hand bij klanten of gebruikers)

    strict sync = yes
    sync always = yes

    Nadeel is dan wel dat het schrijven door de nas trager wordt. Maar dat komt omdat alles direct naar de schijf geschreven wordt en niet eerst in het geheugen vastgehouden wordt.

    Dus je zult moeten kiezen om dit op de 'server' op te lossen (via registry of smb.conf) of via software (met de retry op direxists).

    edit: hoe ziet die source er nu uit?

  7. #22
    Win32.Trojan.Heur.Herby
    Join Date
    Dec 2003
    Location
    Nuenen of all places
    Posts
    149
    Ik laat het voor nu even zo en bouw voor de zekerheid wat extra checks in.
    Mijn NAS is een Synology en heb nog niet uitgezocht of ik samba kan aanpassen.

    Ook op internet niks kunnen vinden mbt dit probleem icm een Synology

  8. #23
    Het probleem komt ook maar zeer sporadisch voor als je schrijf en leesacties te snel achter elkaar doet. Dat merk je dus niet als je gewoon een Word-bestandje opslaat op de NAS (wat 99% van de gebruikers doen).

    Je zag zelf ook dat het maar een enkele keer voorkomt en dat is nou nét precies een kwestie van timing.

Page 2 of 2 FirstFirst 1 2

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
  •