4

ある ftp の場所にあるファイルの zip ファイルを作成し、この zip ファイルをローカルに保存せずに別の ftp の場所にコピーしたいと考えています。

私はこれを小さなサイズのファイルで処理できます。1 MB などの小さなサイズのファイルではうまく機能します。

ただし、ファイルサイズが 100 MB、200 MB、300 MB のように大きい場合は、次のようにエラーが発生します。

java.io.FileNotFoundException: STOR myfile.zip : 550 The process cannot access the 
file because it is being used by another process. 
at sun.net.ftp.FtpClient.readReply(FtpClient.java:251)
at sun.net.ftp.FtpClient.issueCommand(FtpClient.java:208)
at sun.net.ftp.FtpClient.openDataConnection(FtpClient.java:398) 
at sun.net.ftp.FtpClient.put(FtpClient.java:609)

私のコードは

    URLConnection  urlConnection=null;
    ZipOutputStream zipOutputStream=null;
    InputStream inputStream = null;
    byte[] buf;
    int ByteRead,ByteWritten=0; 
    ***Destination where file will be zipped***
    URL url = new URL("ftp://" + ftpuser+ ":" + ftppass + "@"+ ftppass + "/" +
            fileNameToStore + ";type=i");
    urlConnection=url.openConnection();         
    OutputStream outputStream = urlConnection.getOutputStream();
    zipOutputStream = new ZipOutputStream(outputStream);
    buf = new byte[size];
    for (int i=0; i<li.size(); i++) 
    {
        try
        {
            ***Souce from where file will be read***
            URL u= new URL((String)li.get(i));  // this li has values http://xyz.com/folder
            /myPDF.pdf
            URLConnection uCon = u.openConnection();
            inputStream = uCon.getInputStream();
            zipOutputStream.putNextEntry(new ZipEntry((String)li.get(i).substring((int)li.get(i).lastIndexOf("/")+1).trim()));
            while ((ByteRead = inputStream .read(buf)) != -1)    
            {       
                zipOutputStream.write(buf, 0, ByteRead);
                ByteWritten += ByteRead;
            }
            zipOutputStream.closeEntry();
        }
        catch(Exception e)
        {
            e.printStackTrace();
        }
    }
    if (inputStream  != null) {
        try { 
            inputStream .close(); 
        } 
        catch (Exception e) { 
            e.printStackTrace();
        }
    }
    if (zipOutputStream != null) {
        try { 
            zipOutputStream.close(); 
        } catch (Exception e){
            e.printStackTrace(); 
        }     
    }

このエラーを回避して大きなファイルを処理する方法を教えてください

4

2 に答える 2

1

これはファイル サイズとは関係ありません。エラーが示すように、他のプロセスが現在ファイルをロックしているため、ファイルを置き換えることはできません。

大きなファイルでより頻繁に見られる理由は、転送に時間がかかり、同時アクセスの可能性が高くなるためです。

したがって、唯一の解決策は、ファイルを転送しようとするときに、誰もファイルを使用しないようにすることです。頑張ってください。

考えられるその他の解決策:

  1. サーバーで Windows を使用しないでください。
  2. ファイルを一時的な名前で転送し、完了したら名前を変更します。そうすれば、他のプロセスは不完全なファイルを認識しません。いつも良いことです。
  3. 車輪を再発明する代わりにrsyncを使用してください。
于 2012-10-17T15:14:15.377 に答える