PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : (Erledigt) - Sehr seltsames .net Stream close Problem mit speziellen Files.



maz
30.06.2016, 20:04
Ich habe ein sehr sehr seltsames .net Problem.
Und zwar kann ich bei ganz wenigen Files den Stream nicht schliessen.
Wobei, schliessen kann ich ihn schon, nur ist das File danach noch immer vom Programm geöffnet.
Passieren tut das so gut wie nie, aber GulliGirl hat eine Handvoll dieser Dateien "gefunden". :emoji28:

Ausserdem: öffnen und verarbeiten lässt sich der Stream prima.

Hier der Link zu einem dieser Assi Files: File-Upload.net - FALLEN.NFO (http://www.file-upload.net/download-11726967/FALLEN.NFO.html)


Dieser Beispielcode sollte eigentlich bei jedem File funktionieren meines Wissens, nur tut ers nicht :emoji49:

VB:

Imports System.IO
Imports System.Threading
Module Module1
Sub Main()
Dim testfile As String = "c:\testfile.txt"
Dim testStream As FileStream = File.OpenRead(testfile)
Thread.Sleep(500)
testStream.Dispose()
File.Delete(testfile)
'Gleiches Problem mit Using
'Using testStream = New FileStream(testfile, FileMode.Open, FileAccess.Read)
'Thread.Sleep(500)
'End Using
'File.Delete(testfile)
End Sub
End Module

C#:

using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

static class Module1
{
public static void Main()
{
string testfile = "c:\\testfile.txt";
FileStream testStream = File.OpenRead(testfile);
Thread.Sleep(500);
testStream.Dispose();
File.Delete(testfile);
}

Irgendjemand ne Idee? Oder sogar schon selbst mal erlebt.

y0l0sw4gg3r
02.07.2016, 14:34
Hast du mal versucht, den FileStream in einem using-Block zu instanzieren?

maz
02.07.2016, 17:47
Klar, stwht auch so im Example VB Code als Kommentar. Das Problem scheint an sich unlösbar, den der Editor und alle anderen von mir getesteten Programme haben das selbe Problem. Ich habs nun so gelöst, das ich in so einem fall über einen cmd Befehl die Datei lösche, was prima klappt.

prometheus
02.07.2016, 18:58
Wie äußert sich das Problem denn genau? Schlägt die File.Delete()-Methode fehl (IOException)?

Ich kann mir nicht vorstellen, dass dein eigenes Programm daran Schuld ist. Könnte es nicht sein, dass ein anderer Prozess zum Zeitpunkt deines Delete()-Aufrufs Zugriff auf die Datei erlangt hat?

maz
03.07.2016, 00:06
Du kannst dir das file ja mal laden und das Programm nachbauen. Das File muss einen vermurksten Overhead haben, denn wie gesagt, jedes Programm das ich testete hat Probleme damit. Nach einem Upload auf GD ist das File dann auch völlig ok
.net kann die Datei nicht mal löschen, wenn man keinen Stream starten. Das schlägt immer fehl.

Aber eben ich hab ja ne Lösung gefunden, ich machs einfach über ein cmd befehl das geht.

prometheus
03.07.2016, 10:25
Ich habe es eben ausprobiert und die Datei wurde ordnungsgemäß gelöscht. Ohne die genaue Exception zu kennen, die bei dir auftritt, wird es leider sehr schwierig, den Fehler einzugrenzen und dir zu helfen.

Es scheint aber weniger an der Datei selbst zu liegen, sondern vielmehr an sonstigen Einflüssen (z.B. könnten Dateirechte, das Dateisystem oder eben andere Prozesse daran Schuld sein).

maz
03.07.2016, 11:24
Sry ich war etwas dämlich. Der Upload repariert die Datei, das ist mir auch schon bei einem Upload auf GD aufgefallen.
Hier ein rar mit dem FIle, das vermutlich bei dir auch nicht geht: File-Upload.net - Test.rar (http://www.file-upload.net/download-11733499/Test.rar.html)

Andere Einflüsse sinds zu 99% nicht ;) Ich krieg auch keinen schlaue Exzeption, nur das der Prozess in Benutzung sei. Wenn ich nachsehe, welcher das ist, ist der des Programms. Und eben, versuch mal als erstes das NFO im editor zu öffnen, ein Zeichen zu verändern und es wieder zu speichern. Das geht nämlich schon nicht. ;)

prometheus
03.07.2016, 11:45
Ich bekomme eine UnauthorizedAccessException. Was daran nicht hilfreich sein soll, musst du mir erklären. ;)

Schaut man sich die Dateiattribute an, stellt man fest, dass beide Dateien "read only" sind. Die Bibliotheksfunktionen von .NET zum Löschen schlagen dann natürlich fehl. Das RAR-Format speichert diese Dateiattribute (0x21 statt 0x20, siehe hier (https://msdn.microsoft.com/en-us/library/gg258117%28v=vs.85%29.aspx)), deshalb kann ich den Fehler jetzt auch nachvollziehen. Beim Upload der eigentlichen Datei wird hingegen nur der Inhalt übertragen und sämtliche Dateiattribute gehen verloren.

Die Lösung deines Problems sieht nun (in C#) ganz einfach folgendermaßen aus:



File.SetAttributes(testfile, FileAttributes.Normal);
File.Delete(testfile);

Vor dem Löschen werden die Dateiattribute also zunächst zurückgesetzt, wodurch insbesondere das Read-Only-Flag gelöscht wird.

maz
03.07.2016, 12:04
Vielen Dank!
Ich schau nochmal meine Exeption an, aber ich war wohl einfach blind. >_<