Entwickler-Ecke

IO, XML und Registry - Dateiname aus Filestream lesen


lulu83 - Fr 15.11.13 08:46
Titel: Dateiname aus Filestream lesen
Hallo meine Lieben :)

ich stehe vor einem kleinen Problem und mir selbst ist nur eine ziemlich aufwändige Lösung eingefallen.
Und zwar habe ich ein Bluetooth-Dateiübertragungsprogramm geschrieben, welches mir ein paar Dateien von PC auf Laptop sendet.
Nun möchte ich aber 2 verschiedene Arten von Dateien, z.B. Bilder und Dokumente, seperat abspeichern.
Mein Empfängerprogramm gibt aber sozusagen den Dateinamen, sprich auch die Endung, vor.

C#-Quelltext
1:
using (FileStream GetData = new FileStream(FDBPath, FileMode.Create))                    


Nun meine Frage:
Kann ich den ursprünglichen Dateinamen, meiner versendeten Datei, irgendwie aus dem Stream auslesen und weiterverwenden?

Eure lulu :roll:


Th69 - Fr 15.11.13 10:30

Hallo und :welcome:

du bist doch derjenige, der schon bei myCSharp.de unter Original Dateiname aus Stream auslesen [http://www.mycsharp.de/wbb2/thread.php?threadid=110019] schon diese Frage gestellt und eine entsprechende Antwort von herbivore erhalten hat: du mußt vorher den Dateinamen noch selber verschicken und auf der anderen Seite entsprechend auslesen (der Stream selbst kennt keine Dateinamen).


lulu83 - Fr 15.11.13 10:42

Danke sehr :)

Jaa genau.
Das Prinzip an sich habe ich verstanden, nur die Umsetzung ist noch nicht ganz klar.
Wie man sicherlich merkt programmiere ich noch nicht so lange und verstehe nicht ganz wie ich den Namen einzelnd vorschicken kann. :?


Th69 - Fr 15.11.13 11:56

Hallo,

ok, jetzt versteh ich die Problematik. Bei Verwendung des FileStream kann man nur byte-Werte übertragen (und nicht direkt string). Entweder du wandelst mittels UTF8Encoding.GetBytes(text) den Dateinamen in ein Byte-Array und schickst dieses dann mit fileStream.Write() + ein abschließendes Trennzeichen - oder aber du verwendest die beiden Klassen BinaryWriter bzw. zum Einlesen BinaryReader (diese können verschiedene Datentypen direkt verarbeiten).

P.S.: Unter BinaryReader and BinaryWriter Classes in C# [http://www.c-sharpcorner.com/uploadfile/puranindia/binaryreader-and-binarywriter-classes-in-C-Sharp/] habe ich ein Beispiel für dich gefunden.


lulu83 - Fr 15.11.13 12:26

Hey,

ich habe bis jetzt an einer Methode rumgebastelt nur leider funktioniert sie nicht ganz wie sie soll.
Nicht dass du denkst ich möchte einfach Lösungen ohne es zu verstehe. Nein das ist nicht mein Ziel..
Ich möchte es in erster Linie auch verstehen, um es noch öfter anwenden zu können.
Vielleicht schaust du mal über meinen Ansatz rüber :)
Problem: Der Sender sagt genau an welche Datei geschickt wird und sendet sie auch, nur wo die genau landet kann ich nicht sagen, weil sie nicht im Zielordner liegt :S

Sender:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
            Client.EndConnect(result);
            updateUI("Verbunden.");

            Stream = Client.GetStream();

            Byte[]CommandBuffer = Encoding.ASCII.GetBytes(Command);
            Stream.Write(CommandBuffer, 0, CommandBuffer.Length);

            Thread.Sleep(5000);

            updateUI("Datei " + FilePath[0] + " wird gesendet..");
           
            ShareData = File.OpenRead(FilePath[0]);

            Byte[] Buffer = new Byte[1024];
            long TotalLength = ShareData.Length;
            long CurrentLength = 0;
            int Read;

            ProgressBar.Maximum = (int) TotalLength;
            ProgressBar.Step = (int) Buffer.Length;
            
            do
            {
                Read = ShareData.Read(Buffer, 0, Buffer.Length);
                Stream.Write(Buffer, 0, Read);
                CurrentLength += Read;
                ProgressBar.PerformStep();
            } while (TotalLength != CurrentLength);

            updateUI("Datei erfolgreich gesendet.");
            updateUI("");

            Stream.Close();
            ShareData.Close();


Empfänger:

C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
58:
59:
60:
            BTListener.Start();

            Client = BTListener.AcceptBluetoothClient();

            Stream Stream = Client.GetStream();

            while (WaitingForCommand)
            {
                byte[] Command = new byte[1024];
                Stream.Read(Command, 0, Command.Length);

                if("M" == Encoding.ASCII.GetString(Command))
                {
                    Path = @"C:\Users\Gesell\Desktop\Test\a.txt";
                    WaitingForCommand = false;

                    if (File.Exists(Path))
                    {
                        Process MasterProcess = new Process();
                        MasterProcess.StartInfo.FileName = Name;
                        MasterProcess.StartInfo.Arguments = Path;

                        try
                        {
                            MasterProcess.CloseMainWindow();
                            Thread.Sleep(500);
                            if (MasterProcess.HasExited == false)
                                MasterProcess.Kill();
                        }
                        catch (InvalidOperationException ex) { }

                        File.Delete(Path);
                    }
                }
                else if ("E" == Encoding.ASCII.GetString(Command))
                {
                    Path = @"C:\Users\Gesell\Desktop\Test\b.txt";                    
                    WaitingForCommand = false;
                }     
            }

            using (FileStream GetData = new FileStream(Path, FileMode.Create))
            {
                Byte[] Buffer = new Byte[1024];
                int Read = Buffer.Length;

                while (Read != 0)
                {
                    Read = Stream.Read(Buffer, 0, Buffer.Length);

                    GetData.Write(Buffer, 0, Read);
                }
                GetData.Close();
            }

            var FileGO = File.Create(Signal);
            FileGO.Close();

            Stream.Close();
            BTListener.Stop();


Ich hoffe es ist nicht zu wirr.

Gruß lulu