2011-01-14 5 views
2

ich ein Hex-Editor-Steuerelement für C# bin mit, die Quellcode und Binärdateien können here.Fileshare Readwrite funktioniert nicht (C# .NET)

Ein Problem gefunden werden, bei der Verwendung von es war, dass, wenn eine Datei geladen wurde Im Hex-Editor und einem anderen Programm kann das andere Programm die Datei nicht speichern, da es bereits von einem anderen Prozess verwendet wird.

Also fragte ich den Autor des Controls, der mir sagte, das FileShare-Argument in der File.Open-Methode in der FileByteProvider und DynamicFileByteProvider-Klasse auf ReadWrite (es war ursprünglich nur Read) würde es beheben. Also habe ich das gemacht, aber es hat immer noch nicht funktioniert (gleicher Fehler). Es nur auf Write zu setzen, hat auch nicht funktioniert, aber es funktioniert nur auf Read only und None. Die Dateien haben das gleiche Problem in jedem Programm, zum Beispiel Notepad. Sie sind nicht auf ReadOnly oder irgendetwas eingestellt, also habe ich keine Ahnung, warum es nicht funktioniert.

Gibt es irgendetwas, was ich hier vermisse?

Antwort

0
  1. Zu ReadWrite wechseln.
  2. erneut kompilieren.
  3. Versuchen Sie, eine Datei zu öffnen, die Sie noch nicht geöffnet haben, und prüfen Sie, ob das Problem auftritt.

Möglicherweise Sie schlossen sich die Datei nicht in geeigneter Weise so offen blieb, auch nachdem Sie Ihre Anwendung geschlossen (mit vorherigen Berechtigungen lesen)

+0

Was meinen Sie mit "angemessen" hier? Ich habe es mit vielen verschiedenen Dateien versucht und das Problem scheint in allen von ihnen zu sein. – Iceyoshi

+0

Durch das Schließen richtig, ich meinte schließen überhaupt :) Ich habe keine Zeit, um Ihren Code zu analysieren, so war es meine Annahme, dass die Datei überhaupt nicht geschlossen ist. – dzendras

9

Das Problem mit dem anderen Programm sein könnte - wenn es versucht, Um die Datei für den exklusiven Zugriff (ohne Freigabe) zu öffnen, ist es egal, wie Ihr Programm die Datei geöffnet hat - es wird fehlschlagen.


Jedes Mal, wenn ein Programm versucht, eine Datei zu öffnen, geben Sie eine Dateiablage und Fileshare-Parameter (oder Standardwerte gesetzt werden, wenn sie nicht explizit übergeben).

Was Windows dann zu tun hat, ist alle vorhandenen geöffneten Dateizugriffsnummern zu überprüfen und festzustellen, ob sie kompatibel sind. Also vergleicht es Ihren FileAccess-Parameter mit den FileShare-Parametern aller anderen - dürfen Sie tun, was alle anderen für andere getan haben? Und dann führt es die umgekehrte Überprüfung durch - stimmt Ihr FileShare-Parameter mit seinen FileAccess-Parametern überein? - tun sie Dinge, die Sie glücklich sind, damit sie tun? Nur wenn beide Prüfungen bestanden werden, kann Ihre bestimmte offene Anfrage genehmigt werden.

Sie können etwas wie Process Monitor verwenden, um tatsächlich die Win32-Anrufe zu beobachten, die an CreateFile ausgegeben werden, um zu sehen, was jeder Prozess tatsächlich macht.


Notepad können eine Datei öffnen, die für Read/Write geteilt worden ist, aber es kann nicht zurück in die Datei schreiben. Beispielprogramm:

using System.IO; 

namespace ConsoleApplication2 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      var fs = new FileStream(@"C:\Bar.txt", FileMode.OpenOrCreate, FileAccess.ReadWrite, FileShare.ReadWrite); 
      fs.Write(System.Text.Encoding.ASCII.GetBytes("abc"),0,3); 
      fs.Flush(); 
      fs.Close(); //<-- Breakpoint here 
     } 
    } 
} 

Legen Sie den angegebenen Haltepunkt fest, führen Sie das Programm aus. Wenn es den Haltepunkt erreicht, öffnen Sie den Editor, und verwenden Sie es, um C: \ Bar.txt zu öffnen. Alles ist gut. Fügen Sie der Datei mehr Text hinzu und klicken Sie auf Speichern. Sie erhalten eine Fehlermeldung.

+0

Notepad ist ein Beispiel für ein Programm, das ReadWrite ich denke. Ich kann eine Datei im Editor und einem anderen Programm öffnen und Änderungen in beiden ohne Probleme vornehmen. Aber mit diesem Hex-Editor kann ich nicht und das gleiche passiert für ein paar andere Programme (sie funktionieren gut). Das ist es, was mich denken lässt, dass es ein Problem mit dem Hexeditor ist. – Iceyoshi

+0

Ich habe gerade Ihren Beitrag gelesen. Ich bin interessant zu wissen, warum Notepad eine Datei öffnen kann, die für Lesen/Schreiben freigegeben wurde, aber nicht zurück in die Datei schreiben kann? Auch wenn Sie in diesem Sinne Recht haben, bin ich mir 100% sicher, dass es immer noch ein Problem mit dem Hex-Editor ist, da Dateien, die mit diesem Programm und einem anderen Programm geöffnet werden, mit der gleichen Datei funktionieren können. Es lässt mich denken, dass die Dateifreigabe in diesem Programm ebenfalls auf Lesen/Schreiben eingestellt ist. Aber ja, ich bin interessant, wenn ich mehr über Ihre erste Aussage weiß. – Iceyoshi

+0

@Iceyoshi - weil, wenn Notizblock versucht, zurück in die Datei zu schreiben, ändert es seinen Zugriff (oder die Datei erneut öffnen) und Angabe von 'FileShare.None' oder' FileShare.Read' (naja, eigentlich die Win32-Entsprechungen, es ist nicht .Net soweit mir bekannt ist) - und das ist nicht kompatibel mit meinem Programm 'FileAccess.ReadWrite' –