![]() |
IsFileInUse Funktion erstellen
Hallo,
da ich mich momentan um andere Dinge kümmern muss, habe ich einen kleinen Auftrag für eine Funktion zu vergeben. In meinem Programm werden Dateien zum Lesen oder Schreiben geöffnet. Das ist nur möglich, wenn die Datei nicht durch ein anderes Programm geöffnet ist. Ich möchte in einem Programm mit einer Funktion in der Art IsFileInUse(const FileName: string; .......): Boolean abfragen, ob eine bestimmte Datei in Benutzung ist oder nicht. Dabei soll dann der Windows-Standard-Dialog angezeigt werden, der in solchen Fällen auch z.B. vom Explorer angezeigt wird. In diesem Dialog muss angezeigt werden, welches Programm die Datei geöffnet hat und es muss eine Möglichkeit geben, erneut zu Prüfen, ob die Datei geöffnet ist. Man bekommt den Dialog angezeigt, wenn man z.B. ein Worddokuemnt öffnet und versucht es mit dem Explorer zu löschen. So sieht das Dialog aus: ![]() Dort sind auch links zu Microsoft zu finden, wo das ganze dokumentiert ist. Hier gibt es schon eine halbe Lösung: ![]() Ich benötige eine Lösung, die unter Delphi 2010 läuft mit allen Quellcodes. Die Jedi-Komponenten oder andere Komponenten sollen nicht genutzt werden um das ganze möglichst schlank zu halten. Ich möchte nicht wegen nur dieser einen Funktion die ganzen Jedis installieren. Andere Units dürfen nur genutzt werden, wenn diese nur per uses eingebunden werden müssen und in kommerziellen Projekten ohne weitere Kosten genutzt werden dürfen. Bitte nennt mit per PN wie viel ihr dafür haben wollt. Bezahlt wird per Überweisung oder PayPal nach Eingang des Codes und Prüfung auf vollständige Umsetzung der Anforderungen. |
AW: IsFileInUse Funktion erstellen
Sry, wenn ich evtl. jemanden um Geld bringe, aber such doch einmal nach
![]() |
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Bitte vergiss alle Ansätze ohne Treiber:
![]() |
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Ziemlich. Microsoft wird das auch nicht ohne Treiber lösen. Und die API-Funktion wird auch einen Treiber nutzen. Wie heißt denn die API-Funktion, die es seit Vista dafür gibt?
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Neben dem sicher erstklassigen Unlocker, der die Bindungen durchbrechen kann, gibt es auch noch zum Zwecke des bloßen Anzeigens solcher Sperren das Programm "Who lock me?".
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Zitat:
Ansonsten verweise ich auf Chris: ![]() ![]() |
AW: IsFileInUse Funktion erstellen
// hier eine Function
// es braucht noch "uses shlobj" zu Beginn der unit Datei // hope that helps : Gruss Tony function IsFileInUse(fName:string) : boolean; var HFileRes : HFILE; begin Result := False; if not FileExists(fName) then Exit; HFileRes := CreateFile(pchar(fName), GENERIC_READ or GENERIC_WRITE, 0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0); Result := (HFileRes = INVALID_HANDLE_VALUE); if not Result then CloseHandle(HFileRes); end; |
AW: IsFileInUse Funktion erstellen
Nunja, damit bekommst Du aber auch nicht raus, welcher Prozess die Datei geöffnet hat.
[edit] Sry, Willkommen in der DP :dp: [/edit] |
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Die Datei wird zwar von MS Office in der ROT registriert, doch die Implementierung nutzt nicht das IFileIsInUse Interface. Ein Indiz dazu ist, dass der Dialog keine Schalter für "Wechseln zu" und "Schließe Datei" besitzt, sondern "Wiederholen".
Naja, Speedcommander und Windows Explorer zeigen daher nur den Name der Anwendung an. Wenn es jedoch eine andere unbekannte Anwendung ist, dann zeigen beide auch nur "ein Programm" an. Ich denke, dass ich die Implementierung kenne. Sie ist, wie man sieht, jedoch garnicht 100% treffsicher. |
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Die gibt es noch nicht, das ist riesig aufwändig.
Und wenn ich so darüber nachdenke, dann wird es mit 64Bit schwierig, weil Delphi nur 32Bit Apps erstellen kann und daher nur 32Bit Dateilocks erkannt werden. |
AW: IsFileInUse Funktion erstellen
PS: In irgendeinem älterem Thread zu diesem Thema schwirrt ein Programm von mir rum, welches den "billigen" Standardtest umgeht.
Also wo man einfach versucht die Datei exklusiv zu öffnen, welches ja praktsich nur dann geht, wenn noch kein anderer die Datei geöffnet hat (abgesehn von fehlenden Zugriffsrechten, wo man eh keinen Zugriff hat). Mein programm hatte also Zugriff, obwohl CreateFile meinte, die Datei sei nicht in Benutzung und das nur mit der StandardWinAPI, ohne irgendwelche Hooks oder andere Hacks. Und dann gab es noch die unwahrscheinliche Variante, wo man direkt auf den Datenträger zugreift und von hinten rum in die Datei reinkommt, aber seit Vista sollten die meißten Programme eh keinenZugriff auf die Festplatten bekommen (fehlende Rechte) und dann isses ja nicht soooooo einfach die passenden Cluster/Sektoren zur gewünschten Datei rauszufinden. |
AW: IsFileInUse Funktion erstellen
Also, nach langem hin under her, habe ich nun eine Methode gefunden, die den Prozessnamen (d.h. Friendly Name) ermitteln kann. Ohne Treiber oder anderer schlimmer Sachen.
Wer Interesse hat, kann sich bei mir melden. |
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Ursprünglich ging es darum, einem DAU mitzuteilen, das die Datei, die von einer Anwendung importiert werden soll, gerade von WORD oder EXCEL blockiert ist.
Also ich würde das ganz einfach mit CopyFile lösen: Arbeitskopie erstellen und die dann importieren. EXCEL und WORD erlauben das, denn sonst würde man wohl kaum geöffnete Dateien per Mail versenden können. Natürlich bekommt der unbedarfte Anwender dann keine Nachricht, das die Datei blockiert ist. Muss er aber auch nicht, oder? |
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Zitat:
|
AW: IsFileInUse Funktion erstellen
Aber um das von Nico angesprochene Problem
![]() |
AW: IsFileInUse Funktion erstellen
Naja, am besten ist es immernoch, wenn man dem Benutzer zeigen kann, welcher Prozess denn dafür verantwortlich ist. D.h. vielleicht ist ja noch ein MS Word geöffnet irgendwo.
Meine Funktion nutzt neben IFileIsInUse noch andere Methoden ohne Treiber, um den benutzerfreundlichen Namen (z.B. Microsoft Word) und die ProzessID herauszufinden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz