PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie kann man die Codierung einer Datei rausbekommen?


Lord Nikon
2004-02-23, 12:08:17
Hi,
wie kann ich rausbekommen mit c# und dem .NET Framework , wie eine Datei codiert ist , also ob sie im Ansi, Unicode oder sonstigen Formaten gespeichert ist ?

Exxtreme
2004-02-23, 13:01:38
Original geschrieben von Lord Nikon
Hi,
wie kann ich rausbekommen mit c# und dem .NET Framework , wie eine Datei codiert ist , also ob sie im Ansi, Unicode oder sonstigen Formaten gespeichert ist ?
AFAIK gar nicht.

Lord Nikon
2004-02-23, 13:26:40
Hmm wenn das so wäre , wäre das schlecht, da ich über Netzwerk mit den Networkstreams versuche Daten zu versenden , was auch klappt , wenn ich die Codierung einer Datei schon wusste. Wenn die Codierung nicht stimmt , wird der Inhalt einer Datei völlig falsch angezeigt.

Falls das wirklich nicht gehen sollte werde ich Dateien wohl binär öffnen müssen.
EDIT:
Auch wenn ich die Datei binär öffne kommt die Datei in einem falschen Format auf dem anderen PC an.
Code

TcpClient client = new TcpClient(hostName, portNum);
NetworkStream ns = client.GetStream();
FileStream sr=new FileStream (file, FileMode.Open, FileAccess.Read,FileShare.None);
BinaryReader r = new BinaryReader(sr);
long puffersize=sr.Length ;
memo.Text+="Puffersize"+Convert.ToString(puffersize);
client.SendBufferSize=Convert.ToInt32(puffersize);
Byte [] puffer = new Byte [puffersize];
r.Read(puffer,0,puffer.Length);
ns.Write(puffer,0,puffer.Length);

Exxtreme
2004-02-23, 13:39:02
Original geschrieben von Lord Nikon
Hmm wenn das so wäre , wäre das schlecht, da ich über Netzwerk mit den Networkstreams versuche Daten zu versenden , was auch klappt , wenn ich die Codierung einer Datei schon wusste. Wenn die Codierung nicht stimmt , wird der Inhalt einer Datei völlig falsch angezeigt.

Falls das wirklich nicht gehen sollte werde ich Dateien wohl binär öffnen müssen.
Erstellst du die Daten selbst oder hast du auf den Inhalt keinen Einfluss?

Lord Nikon
2004-02-23, 13:48:41
ich habe auf den Inhalt keinen Einfluss.
EDIT:
Empfang

// paar unwichtige Zeilen zuvor
byte[] bytes = new byte[999990];
client.ReceiveBufferSize=99999;
// Read can return anything from 0 to numBytesToRead.
// This method blocks until at least one byte is
stream.Read(bytes, 0, (int) client.ReceiveBufferSize);
memo.Text+=Encoding.UTF8.GetString(bytes);

grakaman
2004-02-23, 13:50:18
Original geschrieben von Lord Nikon
Hi,
wie kann ich rausbekommen mit c# und dem .NET Framework , wie eine Datei codiert ist , also ob sie im Ansi, Unicode oder sonstigen Formaten gespeichert ist ?

System.Text.Encoding.Default, true

Probiere es mal mit dem Default Encoding:

StreamReader sr = new StreamReader( @"C:\Text.txt", Encoding.Default, true);

Ansonsten brauchst du die richtige CodePage.

MfG

Lord Nikon
2004-02-23, 14:28:58
ich habs jetzt so umgeschrieben , dass die Datei jetzt auch Binär geöffnet,geschrieben wird. Der größte Teil wird jetzt richtig angezeigt.Wenn ich es binär öffne und lese , dann dürfte doch auch das .Doc ausgelesen und wieder geschrieben werden können oder?

Beim Empfangen
byte[] bytes = new byte[999990];
client.ReceiveBufferSize=999990;
// Read can return anything from 0 to numBytesToRead.
// This method blocks until at least one byte is read.
stream.Read(bytes, 0, (int) client.ReceiveBufferSize);
// Create the writer for data.
BinaryWriter w = new BinaryWriter(fs);
w.Write(bytes,0,bytes.Length);
Beim Senden
long puffersize=sr.Length ;
memo.Text+="Puffersize"+Convert.ToString(puffersize);
client.SendBufferSize=Convert.ToInt32(puffersize);
Byte [] puffer = new Byte [puffersize];
r.Read(puffer,0,puffer.Length);
ns.Write(puffer,0,puffer.Length);
MessageBox.Show("Datei wurde gesendet");

Harleckin
2004-02-24, 14:55:00
IMO bestimme ich unter *NIX mit dem Programm 'file' den Dateityp von beliebigen Dateien.
Einfach mal das Manual bei Gelegenheit anschauen.. 'man file' außer du nutzt WinGurke. Dann braucht es Cygwin.

Xmas
2004-02-24, 15:41:22
Cygwin für C#? ;)

grakaman
2004-02-24, 15:54:16
Original geschrieben von Harleckin
IMO bestimme ich unter *NIX mit dem Programm 'file' den Dateityp von beliebigen Dateien.
Einfach mal das Manual bei Gelegenheit anschauen.. 'man file' außer du nutzt WinGurke. Dann braucht es Cygwin.

Wie soll dieses Programm denn die Kodierung der Textdatei herausfinden? Das geht doch nur, wenn man alle Zeichen über 127 nach Vorhandensein in allen CodePages sucht.

MfG

Harleckin
2004-02-25, 09:25:15
DESCRIPTION
The file utility performs a series of tests on each file
supplied by file and, optionally, on each file listed in
ffile in an attempt to classify it. If the file is not a
regular file, its file type is identified. The file types
directory, FIFO, block special, and character special are
identified as such. If the file is a regular file and the
file is zero-length, it is identified as an empty file.

If file appears to be a text file, file examines the first
512 bytes and tries to determine its programming language.
If file is an executable a.out, file prints the version
stamp, provided it is greater than 0. If file is a symbolic
link, by default the link is followed and file tests the
file to which the symbolic link refers.

Alles klar?

grakaman
2004-02-25, 10:49:54
Original geschrieben von Harleckin
Alles klar?

Das hat aber nichts mit der Problemstellung hier zu tun.

Harleckin
2004-02-25, 11:21:36
Original geschrieben von grakaman
Das hat aber nichts mit der Problemstellung hier zu tun.
Warum?
Laut Threadstarter ist c# und das .NET Framework vorgegeben und man hat somit freie Wahl bei der Plattform. Somit könnte man Mono[1] und ein *NIX verwenden.

[1] http://www.go-mono.com/rationale.html

grakaman
2004-02-25, 11:24:28
Original geschrieben von Harleckin
Warum?
Laut Threadstarter ist c# und der .NET Framework vorgegeben und man hat somit freie Wahl bei der Plattform. Somit könnte man Mono[1] und ein *NIX verwenden.

[1] http://www.go-mono.com/rationale.html

Nein, dein Tool hat nix mit der Problemstellung zu tun!
Es ist schlicht und ergreifend nicht möglich, herauszufinden, welche CodePage zur Kodierung benutzt wurde. Zeichen zweihundertsonstwas kann in CodePage A etwas ganz anderes sein als in CodePage B.

Lord Nikon
2004-02-25, 14:51:01
Kann mir eine logische Begründung geben , warum man .doc Dateien nicht richtig kopieren kann , auch wenn man die Datei binär öffnet und binär wieder schreibt ?
BTW:
Gibt es in c# auch eine Methode wie ProcessMessages() vom c++ Builder ?

grakaman
2004-02-25, 16:33:46
Original geschrieben von Lord Nikon
Kann mir eine logische Begründung geben , warum man .doc Dateien nicht richtig kopieren kann , auch wenn man die Datei binär öffnet und binär wieder schreibt ?
BTW:
Gibt es in c# auch eine Methode wie ProcessMessages() vom c++ Builder ?

Ist das nur bei .doc Dateien der Fall? Hast du Einfluss darauf, die Datei zu verschicken?

MfG

Lord Nikon
2004-02-25, 17:14:22
Also ich habe Einfluss darauf , die Datei zu verschicken.
Textdateien , bmp Dateien klappen ohne Probleme. Bei Doc und Jpg Dateien gibt es Probleme.

grakaman
2004-02-25, 20:03:26
Original geschrieben von Lord Nikon
Also ich habe Einfluss darauf , die Datei zu verschicken.
Textdateien , bmp Dateien klappen ohne Probleme. Bei Doc und Jpg Dateien gibt es Probleme.

Also ich bin mir nicht so sicher, ob du wirklich auch alles richtig empfängst. Normalerweise brauchst du schon einen Delimiter, um das genaue Ende im Stream zu erkennen. Probiere doch mal das ganze in einer Textdatei mit base64 zu kodieren. Am besten du nimmst dafür XML, dann weißt du wenigstens genau welche Zeichen du herausfiltern musst. Auch kannst du so gleich den Dateinamen mit speichern. Das geht sicher auch anders, nur fällt mir da im Moment nichts weiteres dazu ein.

MfG