PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : vb.net, Datei zugriff nicht exklusiv?


tsaG
2008-07-07, 15:32:16
Hi, ich möchte eine Datei übertragen die dauernd durch ein anderes Programm aktualisiert wird. Daher wird mir bei jedem Versuch die datei (warsch. exklusiv) zu öffnen ein Fehler ala "Die Datei ist in benutzung" angezeigt. Jedoch kann ich sie mit jedem Texteditor bearbeiten oder mit Windows kopieren. Gibt es denn eine möglichkeit die Datei quasi mit "readonly" zu öffnen sodass man sie auslesen kann? habs es im moment so gemacht

Dim bFile() As Byte = System.IO.File.ReadAllBytes("dateipfad")

Mit einer anderen Datei funktioniert dies Einwandfrei, nur mit dieser halt nicht.

hier nun mal der komplette Code:

Public Function statssync()
Dim Pfad As String
Pfad = "ftp://host.de/dateiname.txt"
' set up request...
Dim clsRequest As System.Net.FtpWebRequest = _
DirectCast(System.Net.WebRequest.Create(Pfad), _
System.Net.FtpWebRequest)
clsRequest.Credentials = New System.Net.NetworkCredential( _
"Accountname", "Passwort")
clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
' read in file...
Dim bFile() As Byte = System.IO.File.ReadAllBytes( _
"dateipfad\dateiname.txt")
' upload file...
Dim clsStream As System.IO.Stream = _
clsRequest.GetRequestStream()
clsStream.Write(bFile, 0, bFile.Length)
clsStream.Close()
clsStream.Dispose()

End Function

tsaG
2008-07-07, 20:33:53
*push*

gibt es eine möglichkeit den Dateizugriff für andere Programme zu sperren? somit könnte man dann für einen kurzen moment die datei sperren, übertragen und wieder freigeben.

bei System.IO.File. hab ich nicht wirklich was gefunden o0

Sephiroth
2008-07-07, 21:15:56
Dim s2 As New FileStream(name, FileMode.Open, FileAccess.Read, FileShare.Read)
wir wäre es damit?

http://msdn.microsoft.com/en-us/library/system.io.fileshare.aspx

RattuS
2008-07-07, 23:15:12
gibt es eine möglichkeit den Dateizugriff für andere Programme zu sperren?
Wenn du mit StreamReader/StreamWriter arbeitest, ist der Dateizugriff exklusiv, undzwar solange, bis der StreamReader/StreamWriter wieder geschlossen wird.

tsaG
2008-07-08, 00:20:32
Also ich habe es nun so gemacht und trotzdem tritt noch der gleiche Fehler auf.

Public Function logsync()
Dim sText As String

Dim Pfad As String
Pfad = "ftp://host.de/gmcommand.log"
' set up request...
Dim clsRequest As System.Net.FtpWebRequest = _
DirectCast(System.Net.WebRequest.Create(Pfad), System.Net.FtpWebRequest)
clsRequest.Credentials = New System.Net.NetworkCredential("ACC", "Passwort")
clsRequest.Method = System.Net.WebRequestMethods.Ftp.UploadFile
' read in file...
Dim s2 As New System.IO.FileStream(My.Settings.gmcommandpfad, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim sr As New StreamReader(s2)
sText = sr.ReadToEnd
sr.Close()
Dim bFile() As Byte = System.Text.Encoding.Default.GetBytes(sText)
' upload file...
Dim clsStream As System.IO.Stream = _
clsRequest.GetRequestStream()
clsStream.Write(bFile, 0, bFile.Length)
clsStream.Close()
clsStream.Dispose()

End Function


http://img229.imageshack.us/img229/7743/fehlergk1.jpg

Hab ich was falsch gemacht? :(

RattuS
2008-07-08, 02:02:58
In welcher Zeile kommt denn der Zugriffsfehler? Beim Lesezugriff auf "My.Settings.gmcommandpfad"?

tsaG
2008-07-08, 09:18:18
Ja, genau my.settings.gmcommandpfad ist in den Einstellungen halt als der in der Fehlermeldung genannte D:\Ascent_Emulator\.....

RattuS
2008-07-08, 16:32:52
Dim s2 As New System.IO.FileStream(My.Settings.gmcommandpfad, FileMode.Open, FileAccess.Read, FileShare.Read)
Dim sr As New StreamReader(s2)
Wozu diese beiden Streams? FileStream UND StreamReader wollen exklusiven Zugriff auf die Datei. Der FileStream "s2" wird aber im sichtbaren Code nie geschlossen.
Wenn es beim Lesen einen Zugriffsfehler gibt, dann verursacht wohl eher das Programm/die Funktion, die vorher auf "My.Settings.gmcommandpfad" zugreift, dass die Datei zugriffsgeschützt ist

tsaG
2008-07-08, 23:38:54
Mein Problem ist das ich nicht wirklich weiss mit dem Filestream um zu gehen. Alles was dort raus kommt ist ein filestream, ich brauche aber ein string oder noch besser ein byte array :D. Sonst habe ich es mit streamreader gemacht, jedoch kenn ich mich mit filestream nicht aus und weiss auch nicht was ich damit machen soll. Die ganzen Hilfen im Netz haben mich auch nicht wirklich weiter gebracht. Kann mir jemand eventuell Bitte zeigen wie das auszusehen hat?

Am schliessen liegt es nicht, denn hier das funktioniert auch nicht (immernoch der gleiche fehler)

Dim s2 As New System.IO.FileStream(My.Settings.gmcommandpfad, FileMode.Open, FileAccess.Read, FileShare.Read)
s2.Close()
Dim sr As New StreamReader(s2)
sText = sr.ReadToEnd
sr.Close()

RattuS
2008-07-09, 00:13:02
Vorerst ist ganz egal, ob du FileStream richtig verwendest oer nicht, denn prinzipiell lässt sich auf die in "My.Settings.gmcommandpfad" verwiesene Datei ja nicht zugreifen, egal ob mit FileStream oder StreamReader. Hast du noch andere Funktionen, die auf "My.Settings.gmcommandpfad" zugreifen?

tsaG
2008-07-09, 00:28:20
Nein :(

Das ganze läuft ja auch nebenbei noch mit einer anderen Datei (stats.xml), bei dieser ist es der gleiche code (nur halt ein anderer pfad, my.settings.statspfad) und dort funktioniert es einwandfrei.

Vorher musste ich die datei immer händisch auf den FTP server laden, das wollte ich mir mit diesem programm nun erleichtern :(

EDIT:

Wenn ich es auf meinem Rechner ausprobiere (habe einfach die Textdateien unter dem gleichen Pfad erstellt) funktioniert es einwandfrei. Nur funktioniert halt diese "read only" funktion nicht. Die Datei wird von einem anderen Programm genutzt, jedoch soll mein programm diese trotzdem auslesen können.

RattuS
2008-07-09, 01:29:38
Wie gesagt: Wenn dieses andere Programm den Lesezugriff sperrt, kannst du diese Datei nunmal nicht auslesen. Es gibt keinen Weg den Lesezugriff unter Windows zu erzwingen.

Es würde übrigens helfen, wenn du die JIT Debug-Ausgabe in Detail mal postest.

Edit: Hier gibts eine präzisere Dokumentation von MS: http://download.microsoft.com/download/9/2/3/923d72fb-0076-49b6-96c4-aac1c255a60e/26273_10_Markt-Technik.pdf

Kabelsalat
2008-07-09, 01:43:37
Da sperrt dich wohl das andere Programm aus. Jetzt wird es tricky:

1) Anderes Programm dazu bewegen die Datei (temporär) freizugeben bzw. dir den Inhalt zu übermitteln
2) VSS - Volume Shadow Copy Service. Nur über Windows API und komplex.

tsaG
2008-07-09, 13:32:22
Danke für das PDF!

Obwohl ich es in der Config aktiviert habe (siehe Spoiler) wird JitDebugging nicht aktiviert...

See the end of this message for details on invoking
just-in-time (JIT) debugging instead of this dialog box.

************** Exception Text **************
System.IO.IOException: The process cannot access the file 'D:\Ascent_Emulator\logs\gmcommand.log' because it is being used by another process.
at System.IO.__Error.WinIOError(Int32 errorCode, String maybeFullPath)
at System.IO.FileStream.Init(String path, FileMode mode, FileAccess access, Int32 rights, Boolean useRights, FileShare share, Int32 bufferSize, FileOptions options, SECURITY_ATTRIBUTES secAttrs, String msgPath, Boolean bFromProxy)
at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share)
at WindowsApplication1.Form1.logsync()
at WindowsApplication1.Form1.Button2_Click(Object sender, EventArgs e)
at System.Windows.Forms.Control.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnClick(EventArgs e)
at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
at System.Windows.Forms.Control.WndProc(Message& m)
at System.Windows.Forms.ButtonBase.WndProc(Message& m)
at System.Windows.Forms.Button.WndProc(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
at System.Windows.Forms.NativeWindow.Callback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)


************** Loaded Assemblies **************
mscorlib
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/Microsoft.NET/Framework/v2.0.50727/mscorlib.dll
----------------------------------------
BF Sync
Assembly Version: 1.0.0.0
Win32 Version: 1.0.0.0
CodeBase: file:///C:/Documents%20and%20Settings/Administrator/Desktop/sync(2).exe
----------------------------------------
Microsoft.VisualBasic
Assembly Version: 8.0.0.0
Win32 Version: 8.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/Microsoft.VisualBasic/8.0.0.0__b03f5f7f11d50a3a/Microsoft.VisualBasic.dll
----------------------------------------
System
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System/2.0.0.0__b77a5c561934e089/System.dll
----------------------------------------
System.Windows.Forms
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Windows.Forms/2.0.0.0__b77a5c561934e089/System.Windows.Forms.dll
----------------------------------------
System.Drawing
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Drawing/2.0.0.0__b03f5f7f11d50a3a/System.Drawing.dll
----------------------------------------
System.Runtime.Remoting
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Runtime.Remoting/2.0.0.0__b77a5c561934e089/System.Runtime.Remoting.dll
----------------------------------------
System.Configuration
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Configuration/2.0.0.0__b03f5f7f11d50a3a/System.Configuration.dll
----------------------------------------
System.Xml
Assembly Version: 2.0.0.0
Win32 Version: 2.0.50727.42 (RTM.050727-4200)
CodeBase: file:///C:/WINDOWS/assembly/GAC_MSIL/System.Xml/2.0.0.0__b77a5c561934e089/System.Xml.dll
----------------------------------------

************** JIT Debugging **************
To enable just-in-time (JIT) debugging, the .config file for this
application or computer (machine.config) must have the
jitDebugging value set in the system.windows.forms section.
The application must also be compiled with debugging
enabled.

For example:

<configuration>
<system.windows.forms jitDebugging="true" />
</configuration>

When JIT debugging is enabled, any unhandled exception
will be sent to the JIT debugger registered on the computer
rather than be handled by this dialog box.




<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" >
<section name="WindowsApplication1.My.MySettings" type="System.Configuration.ClientSettingsSection, System, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false" />
</sectionGroup>
</configSections>
<system.diagnostics>
<sources>
<!-- Dieser Abschnitt definiert die Protokollierungskonfiguration für My.Application.Log -->
<source name="DefaultSource" switchName="DefaultSwitch">
<listeners>
<add name="FileLog"/>
<!-- Auskommentierung des nachfolgenden Abschnitts aufheben, um in das Anwendungsereignisprotokoll zu schreiben -->
<!--<add name="EventLog"/>-->
</listeners>
</source>
</sources>
<switches>
<add name="DefaultSwitch" value="Information" />
</switches>
<sharedListeners>
<add name="FileLog"
type="Microsoft.VisualBasic.Logging.FileLogTraceListener, Microsoft.VisualBasic, Version=8.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a, processorArchitecture=MSIL"
initializeData="FileLogWriter"/>
<!-- Auskommentierung des nachfolgenden Abschnitts aufheben und APPLICATION_NAME durch den Namen der Anwendung ersetzen, um in das Anwendungsereignisprotokoll zu schreiben -->
<!--<add name="EventLog" type="System.Diagnostics.EventLogTraceListener" initializeData="APPLICATION_NAME"/> -->
</sharedListeners>
</system.diagnostics>
<userSettings>
<WindowsApplication1.My.MySettings>
<setting name="gmcommandpfad" serializeAs="String">
<value>D:\Ascent_Emulator\logs\gmcommand.log</value>
</setting>
<setting name="statspfad" serializeAs="String">
<value>D:\Ascent_Emulator\forHP\stats.xml</value>
</setting>

</WindowsApplication1.My.MySettings>
</userSettings>
<system.windows.forms jitDebugging="true" />
</configuration>

tsaG
2008-07-10, 16:10:05
Nuja, Problem "gelöst" ich hab nun eine Batch Datei die bei jedem aufruf aufgeführt wird und die Datei kopiert. Diese Kopie wird dann vom Programm gelesen und dementsprechend weiter verarbeitet. So funktionert es. Zwar nicht ganz sauber, aber es funktioniert.

Gast
2008-07-13, 01:13:46
Wenn du es mit einem Batch kopieren kannst, musst du es mit deinem Programm auch auslesen können.

FileShare.Read Ermöglicht das nachfolgende Öffnen der Datei zum Lesen. Wenn dieses Flag nicht festgelegt wurde, schlagen alle Anforderungen (durch diesen oder einen anderen Prozess) fehl, die Datei zum Lesen zu öffnen, bis die Datei geschlossen wird. Selbst wenn dieses Flag angegeben wurde, können dennoch weitere Berechtigungen für den Zugriff auf die Datei erforderlich sein.

ist falsch. Du erlaubst anderen Prozessen keinen Schreib Zugriff an, dass kann aber nicht gehen, da ja bereits ein anderer Prozess deine Datei lustig beschreibt.

ReadWrite Ermöglicht das nachfolgende Öffnen der Datei zum Lesen oder Schreiben. Wenn dieses Flag nicht angegeben wurde, schlagen alle Anforderungen (durch diesen oder einen anderen Prozess) fehl, die Datei zum Lesen oder Schreiben zu öffnen, bis die Datei geschlossen wird. Selbst wenn dieses Flag angegeben wurde, können dennoch weitere Berechtigungen für den Zugriff auf die Datei erforderlich sein.

ist das mittel der Wahl. Da du alles erlaubst. Teste es einfach einmal.

http://msdn.microsoft.com/de-de/library/system.io.fileshare(VS.80).aspx

gruß