Autor Beitrag
lulu83
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Fr 15.11.13 08:46 
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.
ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 15.11.13 10:30 
Hallo und :welcome:

du bist doch derjenige, der schon bei myCSharp.de unter Original Dateiname aus Stream auslesen 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).


Zuletzt bearbeitet von Th69 am Fr 15.11.13 12:00, insgesamt 2-mal bearbeitet
lulu83 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: 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# habe ich ein Beispiel für dich gefunden.
lulu83 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: 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:
ausblenden volle Höhe 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:
ausblenden volle Höhe 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