0

私のコードによると、フォルダにファイルが含まれている場合は正常に送信されますが、フォルダにフォルダが含まれている場合はクライアント側にフォルダが作成されません。

サーバーコード:

ObjectOutputStream oos = new ObjectOutputStream(connection.getOutputStream());
File file = new File("home/");
File[] children = file.listFiles();

if (children != null) {
  for (File child : children) {
    all.add(child);  

    if(!child.isDirectory()){
      oos.writeObject(child.getName());
      FileInputStream fis = new FileInputStream(child);  

      while ((bytesRead = fis.read(buffer)) > 0) {  
        oos.writeObject(bytesRead);  
        oos.writeObject(Arrays.copyOf(buffer, buffer.length));  
      }   

    }
  }
}

クライアントコード:

oos = new ObjectOutputStream(theSocket.getOutputStream());
ois = new ObjectInputStream(theSocket.getInputStream());

out = new PrintWriter(theSocket.getOutputStream( ));

while (true) {
  Object o = ois.readObject();

  File file = new File(o.toString());

  if(file.isDirectory())
    File Dir = new File("new/").mkdir();
  if(!file.isDirectory()){
    FileOutputStream fos = new FileOutputStream(o.toString());    

    do {  
      o = ois.readObject();
      bytesRead = (Integer) o;
      o = ois.readObject();  
      buffer = (byte[])o;  

      fos.write(buffer, 0, bytesRead);  
    }
    while (bytesRead == BUFFER_SIZE);  
    fos.close(); 
  }
}

エラーは表示されませんが、代わりにクライアント側に名前の匿名ファイル(サーバー側のフォルダー)が作成されます。私のコードの何が問題なのか教えてください!

4

1 に答える 1

0

あなたの答え(の一部)は再帰だと思います。それを行うにはいくつかの方法があります。1つは、bytesReadをディレクトリに対して-1またはNULLとして送信し、クライアント側でも再帰することです。もう1つは、ファイルとともに相対パスを送信し、必要に応じてディレクトリを作成することです。クライアント側。

サーバ側:

void processFile(File file, String path)
{
  if (file.isDirectory())
  {
    File[] children = file.listFiles();
    for (File child : children)
    {
      all.add(child);
      processFile(child, path + file.getName() + "/");
    }
  }
  else
  {
    oos.writeObject(path + child.getName());
    FileInputStream fis = new FileInputStream(child);  
    while ((bytesRead = fis.read(buffer)) > 0)
    {  
      oos.writeObject(bytesRead);  
      oos.writeObject(buffer);  
    }
    oos.writeObject(BUFFER_SIZE);
  }
}

processFile(file, "")またはで呼び出されprocessFile(file, "/")ます。

通話後のように言って、いつ停止するかを知るoos.writeObject("")のと同じようにクライアント側でチェックを行います。name.length() == 0

クライアント側:

while (true)
{
  String name = (String)ois.readObject();
  if (name.length() == 0) break;
  // "/new/" is the absolute path of the directory where you want all these files to be created
  name += "/new/";

  File dir = new File(name.substring(0, name.lastIndexOf('/')));
  if (!dir.exists())
    dir.mkdirs();

  FileOutputStream fos = new FileOutputStream(new File(name));    

  bytesRead = (Integer) ois.readObject();
  while (bytesRead != BUFFER_SIZE)
  {  
    buffer = (byte[])ois.readObject();
    fos.write(buffer, 0, bytesRead);  
    bytesRead = (Integer) ois.readObject();
  }
  fos.close(); 
}
于 2012-12-28T13:40:13.890 に答える