Schreibe hier und schreibe da … die Fehlermeldungen gibt es gratis dazu

Beim Schreiben großer Dateien mit C# auf ein Netzwerklaufwerk kann man ganz unerwartet auf einen lästigen Fehler stoßen .. ab einer Größe von ca. 64 MB lächelt dem Anwender eine eher wenig aussagekräftige System.IO.Exception mit der Meldung “Nicht genügend Systemressourcen, um den angeforderten Dienst auszuführen” entgegen.

Ursache hierfür ist der Write()-Aufruf im unteren Codeabschnitt, die intern verwendete Win32 API-Funktion ist auf 65535 Bytes pro Aufruf begrenzt. Dieser Fehler existiert nur beim Zugriff auf einen Netzwerkpfad, beim Zugriff auf ein lokales Laufwerk funktioniert der Code einwandfrei.


public static void WriteFileError(byte[] buffer)
{
FileInfo outfile = new
FileInfo(@"\\server\share\testfile.zip");
using (FileStream outstream = outfile.OpenWrite())
{
outstream.Write(buffer, 0, buffer.Length);
outstream.Flush();
outstream.Close();
}
}

Auf dem Portal Microsoft Connect ist dieser Fehler mit der Bug-Nummer 486256 dokumentiert, der dort angegebene Workaround die Datei erst mal lokal zu schreiben und dann zu verschieben ist von der Vorgehensweise jedoch etwas unglücklich ..

Die Datei kann auch trotz des Bugs direkt geschrieben werden indem die Schreibzugriffe in kleinere Portionen unterteilt werden.

So lässt sich eine Zwischenspeicherung in einer lokalen Datei umgehen.


public static void WriteFileOK(byte[] buffer)
{
FileInfo outfile = new
FileInfo(@"\\server\share\testfile.zip");
int writelimit = 65535;
int byteswritten = 0;
using (FileStream outstream = outfile.OpenWrite())
{
while (byteswritten < buffer.Length)
{
int bytestowrite = (buffer.Length - byteswritten > writelimit) ? writelimit : buffer.Length - byteswritten;
outstream.Write(buffer, byteswritten, bytestowrite);
outstream.Flush();
byteswritten += bytestowrite;
}
outstream.Flush();
outstream.Close();
}
}