2017-02-08 1 views
0

작업 :A 폴더에서 B 폴더로 선택한 파일을 복사하려고합니다. 두 폴더 모두 외부 저장소에 있습니다.파일을 폴더로 복사 할 수 없습니다.

문제 : 그러나 완벽하게 작동하지만 어느 시점에서 파일 복사가 중지됩니다. 예를 들어 500 개의 파일을 복사하려는 경우 110 개의 파일 만 복사합니다. 또한 비디오 파일을 복사 할 수 없다는 사실을 알았습니다. 이미지로만 작동합니다.

코드 :

내가 파일을 복사하는 데 사용하는 방법 :

private static void makeFileCopy(File source, File dest) throws IOException { 
    InputStream is = null; 
    OutputStream os = null; 
    try { 
     is = new FileInputStream(source); 
     os = new FileOutputStream(dest); 
     byte[] buffer = new byte[1024]; 
     int length; 
     while ((length = is.read(buffer)) > 0) { 
      os.write(buffer, 0, length); 
     } 
    }finally { 
     try { 
      if (is != null) 
       is.close(); 
      if (os != null) 
       os.close(); 
     }catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

하나 더 :

public static void copyFileList(Context context, List<MediaFile> contentList, File mediaFolder) { 
    if (contentList != null) { 
     ContentValues values=new ContentValues(); 
     for (int index=0;index<contentList.size();index++) { 
      MediaFile mediaFile=contentList.get(index); 
      File file = new File(mediaFolder, mediaFile.mediaFile().getName()); 
      boolean isVideo=mediaFile.getType()== MediaFile.Type.VIDEO; 
      if (!file.exists()) { 
       try { 
        if (!file.createNewFile()) { 
         continue; 
        } 
        FileUtils.makeFileCopy(mediaFile.getRealFile().getAbsoluteFile(), file); 

       } catch (IOException ex) { 
        ex.printStackTrace(); 
        continue; 
       } 

       if (isVideo) { 
        values.put(MediaStore.Video.VideoColumns.DATA, file.getAbsolutePath()); 
        context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); 
       } else { 
        values.put(MediaStore.Images.ImageColumns.DATA, file.getAbsolutePath()); 
        context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
       } 
       values.clear(); 
      } 
     } 
    } 
} 

감사합니다!

+0

항상 110 개의 파일 만 복사합니까? 비디오 파일과 관련하여 - 얼마나 큰가? 작은 비디오 파일을 넣으면 무시됩니까? 로그에서 예외를 확인 했습니까? – yakobom

+0

if (! file.createNewFile()) { 계속; 그 대구를 제거하십시오. 그건 소용 없어. – greenapps

+0

테스트를 위해 ContentValues ​​내용없이 시도하십시오. – greenapps

답변

0

마지막으로 그 문제를 해결했습니다. 이것은 내가 만든 매우 어리석은 실수입니다.

해결책 : 이미 대상 폴더에있는 파일의 복사본을 만들고 싶습니다. if (!file.exists())을 확인하면 통과하지 못했습니다. 따라서 다음 코드를 작성했습니다.

public static void copyFileList(Context context, List<MediaFile> contentList, File mediaFolder) { 
    if (contentList != null) { 
     ContentValues values=new ContentValues(); 
     for (int index=0;index<contentList.size();index++) { 
      MediaFile mediaFile=contentList.get(index); 
      String fileName=mediaFile.mediaFile().getName(); 

      boolean isVideo=mediaFile.getType()== MediaFile.Type.VIDEO; 
      File file = new File(mediaFolder, fileName); 
      //let a user to decide whether to create a copy of already existing files 
      if(!file.exists()) { 
       file=new File(mediaFolder,uniqueNameFor(fileName)); 
      } 

      if(!file.exists()) { 
       try { 
        FileUtils.makeFileCopy(mediaFile.mediaFile().getAbsoluteFile(), file); 
       } catch (IOException ex) { 
        ex.printStackTrace(); 
        continue; 
       } 

       if (isVideo) { 
        values.put(MediaStore.Video.VideoColumns.DATA, file.getAbsolutePath()); 
        values.put(MediaStore.Video.VideoColumns.MIME_TYPE,mediaFile.getMimeType()); 
        context.getContentResolver().insert(MediaStore.Video.Media.EXTERNAL_CONTENT_URI, values); 
       } else { 
        values.put(MediaStore.Images.ImageColumns.DATA, file.getAbsolutePath()); 
        values.put(MediaStore.Images.ImageColumns.MIME_TYPE,mediaFile.getMimeType()); 
        context.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values); 
       } 

      } 
      values.clear(); 
     } 
    } 
} 

파일의 고유 한 이름을 만들면됩니다. 채널을 사용

private static void makeFileCopy(File source, File dest) throws IOException { 
    FileChannel inputChannel = null; 
    FileChannel outputChannel = null; 
    try { 
     inputChannel = new FileInputStream(source).getChannel(); 
     outputChannel = new FileOutputStream(dest).getChannel(); 
     outputChannel.transferFrom(inputChannel, 0, inputChannel.size()); 
    } finally { 
     try { 
      if (inputChannel != null) 
       inputChannel.close(); 
      if (outputChannel != null) 
       outputChannel.close(); 
     }catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

조금 더 빨리 이전의 접근 방식을 사용하는 것보다 :

또한 나는 복사 방법을 변경했다. 파일을 복사하는 4 가지 방법을 확인하십시오 here.

도움 주셔서 감사합니다.

관련 문제