Voor een bepaalde Lotus Notes toepassing heb ik een DLL geschreven die in Lotus Notes hooked.
De DLL voert een aantal bewerkingen uit op bestanden, namelijk renamen en verwijderen.
Het doel is als volgt. Als Notes opstart moet er een nieuwe file worden gebruikt. Dit doe ik door:
- een mogelijk aanwezige oude backup (file.bak) renamen naar .tmp
- deze .tmp weggooien
- het oude bestand te backuppen: renamen van file.cur naar file.bak
- het nieuwe bestand renamen van file.new naar file.bak
Nu gaat dit vaak goed. Maar soms lijkt de programmacode sneller te lopen dan het I/O en kan ik niet backuppen omdat er nog een oud bestand staat. Dit gebeurt soms als de bestanden groter dan 10 mb zijn (kan vaak voorkomen).
Is er een manier om te wachten totdat windows klaar is met de rename/verwijder actie? Een loop met een aantal checks op aanwezigheid is niet echt een optie, omdat het "altijd" moet werken, zonder dat ik foutmeldingen kan geven aan de gebruiker.
Mijn rename functie ziet er als volgt uit:
Zoals jullie zien, heb ik er al een aantal delays ingebouwd, maar dat is natuurlijk niet een hele nette optie.
De DLL voert een aantal bewerkingen uit op bestanden, namelijk renamen en verwijderen.
Het doel is als volgt. Als Notes opstart moet er een nieuwe file worden gebruikt. Dit doe ik door:
- een mogelijk aanwezige oude backup (file.bak) renamen naar .tmp
- deze .tmp weggooien
- het oude bestand te backuppen: renamen van file.cur naar file.bak
- het nieuwe bestand renamen van file.new naar file.bak
Nu gaat dit vaak goed. Maar soms lijkt de programmacode sneller te lopen dan het I/O en kan ik niet backuppen omdat er nog een oud bestand staat. Dit gebeurt soms als de bestanden groter dan 10 mb zijn (kan vaak voorkomen).
Is er een manier om te wachten totdat windows klaar is met de rename/verwijder actie? Een loop met een aantal checks op aanwezigheid is niet echt een optie, omdat het "altijd" moet werken, zonder dat ik foutmeldingen kan geven aan de gebruiker.
Mijn rename functie ziet er als volgt uit:
C++:
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
| int CopyFile(char* OldFile, char* NewFile, char* BackupFile) { char TempFile[MAXENVVALUE]; char buff[MAXENVVALUE]; // check voor de nieuwe file (.new) if(_access(NewFile, 0) != 0){ return 3; } // check voor een oude backup file en verwijder eventueel if(_access(BackupFile, 0) != -1){ strncpy(TempFile, BackupFile, strlen(BackupFile)-3); strcat(TempFile, "tmp"); if (OSGetEnvironmentString("$Debugdll", buff, sizeof(buff))) { MessageBox(NULL, TempFile, "Error", MB_OK); } if(rename(BackupFile, TempFile) != 0){ return 2; } else{ Sleep(500); remove(TempFile); } } // rename de huidige file naar backup file if(rename(OldFile, BackupFile) != 0){ return 4; } else{ Sleep(500); } // hernoem nieuwe file naar oude huidige file if(rename(NewFile, OldFile) != 0){ if(rename(BackupFile, OldFile) != 0){ return 5; } else{ return 6; } } Sleep(500); return 0; } |
Zoals jullie zien, heb ik er al een aantal delays ingebouwd, maar dat is natuurlijk niet een hele nette optie.
[ Voor 4% gewijzigd door Peetman op 09-09-2003 13:38 ]