2017-03-23 3 views
0

クライアントがサーバーからファイルやフォルダを要求してドキュメントに保存する方法を作成しようとしています。私はすべてのサーバーのファイルのツリービューを持っている現時点では、クライアントは、右下のコードでファイルまたはフォルダをクリックして受け取ることができるように:TCP、ファイルとフォルダを転送しているにもかかわらず、フォルダのみがファイル名を保持しているようです

 if (isConnected()) 
     { 
      if (selectedFile.Nodes.Count > 0) //If its a folder 
      { 
       consoleLog("Receiving folder (" + selectedFile.Text + ")... please wait"); 
       clientSendText("receiveFolder#" + selectedFile.FullPath.ToString() + "#", 1); 
      } 
      else //If its a file 
      { 
       consoleLog("Receiving file (" + selectedFile.Text + ")... please wait"); 
       clientSendText("receiveFile#" + selectedFile.FullPath.ToString() + "#", 1); 
      } 
     } 

だから、ファイルまたはフォルダのいずれかを受け取るためにコマンドを送信します

 public static void receiveFolder(string path) 
    { 
     path = getFullFolderPath(path); 

     if (Directory.Exists(path)) 
     { 
      ZipFile.CreateFromDirectory(path, path + ".zip", CompressionLevel.Fastest, true); 
      serverSendFile(path + ".zip", 8); 

      if (File.Exists(path + ".zip")) 
      { 
       File.Delete(path + ".zip"); 
      } 
     } 
     else 
     { 
      serverSendText("Folder does not exist", 1); 
     } 
    } 

    public static void receiveFile(string path) 
    { 
     path = getFullFilePath(path); 

     if (File.Exists(path)) 
     { 
      serverSendFile(path, 9); 
     } 
     else 
     { 
      serverSendText("File does not exist", 1); 
     } 
    } 

そのファイルまたはフォルダだからイムフォルダを送信する方法は、ファイルとして送信し、zipファイルを削除、最初にそれをビュンされた場合は、サーバー側では、それはどちらかに応じて、次のいずれかのコマンドを実行しますフォルダー。

ので、フォルダが完璧に動作受け
   else if (dataType == 8) 
       { 
        this.Invoke(new MethodInvoker(delegate 
        { 
         string savePath = Properties.Settings.Default.textSavePath; 

         consoleLog("Reply from server: folder receiving...please wait"); 

         File.WriteAllBytes(savePath + ".zip", data); 
         ZipFile.ExtractToDirectory(savePath + ".zip", savePath); 

         if (File.Exists(savePath + ".zip")) 
         { 
          File.Delete(savePath + ".zip"); 
         } 

         consoleLog("Folder saved to " + savePath); 
        })); 
       } 
       else if (dataType == 9) 
       { 
        this.Invoke(new MethodInvoker(delegate 
        { 
         string savePath = Properties.Settings.Default.textSavePath; 

         consoleLog("Reply from server: file receiving...please wait"); 
         File.WriteAllBytes(savePath, data); 

         consoleLog("File saved to " + savePath); 
        })); 
       } 

、デフォルト:

だけので8ジッパーであり、9は任意のファイル [次のようにそれを受け取るクライアントである、第二のパラメータは、データ型であることに注意します保存場所はmydocumentsなので、同じ名前でそこに送信し、自分自身を解凍して普通のように見ることができます。ファイル名がないのは普通のファイルと同じですが、保存するパスの最後に "/picture.png"を手動で追加する必要があります。保存すると完璧な画像が保存されます損なわれていないが、私はなぜフォルダがその名前を保持しているのかわからないが、ファイルはdoesnt。ファイル名はデータとともに送信されていますか?私は右の私の目の前で何かをしないのです、何かアドバイスはまた、「あなたはzipファイルを受信したら、名前を付けて保存

public static void serverSendFile(string filePath, byte dataType) 
    { 
     if (tcpServer != null) 
     { 
      if (tcpClient.Connected == true) 
      { 
       byte[] data = File.ReadAllBytes(filePath); 
       data = data.Concat(new byte[] { (byte)dataType }).ToArray(); 
       stream = tcpClient.GetStream(); 
       int length = data.Length; 
       byte[] datalength = new byte[4]; 
       datalength = BitConverter.GetBytes(length); 
       stream.Write(datalength, 0, 4); 
       stream.Write(data, 0, data.Length); 
      } 
     } 
    } 
+0

TCPはファイル転送プロトコルではありません。どのようにファイルを送受信していますか? – Luaan

+0

ファイルのすべてのバイトを読み込んでバイト配列に入れ、データ型を連結してクライアントに送信します。コードを追加する必要があります –

+0

ファイル名も同様に連結してください。ファイル名はファイルデータの一部ではなく、格納ディレクトリの値です。確かに、あなたは別のディレクトリに複数の名前を持つ1つのファイルを持つことができます:) – Luaan

答えて

0

下のコードを使用してファイルを送信する

イムありがとう参考になります。 zip "を抽出して抽出します。 Zipファイルには、ファイルとフォルダの名前に関する情報が含まれています。

あなたは、ファイル名に関する情報を処理しませんいくつかの他のファイルを受け取る(あなたも、コンテンツとそれを一緒に送っていますか?)

あなたは、関数savepathとファイル名を組み合わせて記述する必要がありますこのファイルへのデータ

+0

ああ、実際のファイルを送信している(zip)はファイルのような名前を持っていませんが、それを解凍すると、そこに常に格納されていた元のフォルダ名が表示されます。この周りの簡単な方法は、単なるファイルを圧縮して名前を保持することになりますか? –

関連する問題