2009-08-25 2 views
27

WinXP를 사용하고 있습니다. Java를 사용하여 파일 목록을 생성합니다. 파일은 처음에 abc.txt.temp로 생성되며 생성이 완료되면 abc.txt로 이름이 바뀝니다.renameTo()가 실패한 이유를 찾는 방법은 무엇입니까?

그러나 파일을 생성 할 때 일부 파일의 이름을 바꾸지 못했습니다. 무작위로 발생합니다.

왜 실패했는지 알 수 있습니까?

int maxRetries = 60; 
logger.debug("retry"); 
while (maxRetries-- > 0) 
{ 
    if (isSuccess = file.renameTo(file2)) 
    { 
     break; 
    } 
    try 
    { 
     logger.debug("retry " + maxRetries); 
     Thread.sleep(1000); 
    } 
    catch (InterruptedException e) 
    { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

//file.renameTo(file2); 
Thread.currentThread().getThreadGroup().getParent().list(); 

그리고 결과 : 나는 이유를 알아 내기 위해 체계적인 접근 방법을 알고 싶습니다

[DEBUG][2009-08-25 08:57:52,386] - retry 1 
[DEBUG][2009-08-25 08:57:53,386] - retry 0 
java.lang.ThreadGroup[name=system,maxpri=10] 
    Thread[Reference Handler,10,system] 
    Thread[Finalizer,8,system] 
    Thread[Signal Dispatcher,9,system] 
    Thread[Attach Listener,5,system] 
    java.lang.ThreadGroup[name=main,maxpri=10] 
     Thread[main,5,main] 
     Thread[log4j mail appender,5,main] 
[DEBUG][2009-08-25 08:57:54,386] - isSuccess:false 

. 감사.

+0

예외가 발생 했습니까? – seth

+0

번. 전혀 예외는 아니다. 거짓 만 반환합니다. – janetsmith

+0

내 대답이 업데이트되었습니다. –

답변

24

이름 바꾸기가 실패한 이유는 파일이 아직 열려 있기 때문일 수 있습니다. 파일을 닫는 경우에도, 그 때문에 (예를 들어)의 개방 개최 될 수있다 :

  1. 파일 핸들은 프로세스의 하위 프로세스에 의해 상속됩니다
  2. 안티 바이러스 프로그램의 파일을 검색한다 바이러스 등 (예 : Google 데스크톱 또는 윈도우 인덱싱 서비스 등)이 개방
  3. 인덱서를 가지고이 파일을 연
, 파일이 열려 유지되고 있는지 찾을 수 있도록

사용 도구 등 FileMonHandle.

업데이트 : 파일이 매우 짧은 시간 동안 만 열려 있으면 (예 : 바이러스 백신 검색의 경우) Unlocker와 같은 도구가 도움이되지 않을 수 있습니다. 그러나 javaw.exe가 파일을 열어 놓은 것으로 표시되면 바로 그 문제입니다.

+0

Unlocker를 사용하고 있습니다. 유일한 로커 인 "javaw.exe"만 보여줍니다. : – janetsmith

+0

안티 바이러스 및 인덱서와 같은 검사 응용 프로그램은 파일을 보관할 수 없어 변경되거나 이름이 변경되지 않아야한다고 생각합니다. 실제로 이것은 WinXP의 경우입니까? – Yuval

+0

그들은 파일은 오래 동안 열리지 만 일반적으로 파일 변경을 감시하고 파일을 업데이트 한 후 검사합니다. 파일에 쓰고 닫은 다음 이름 바꾸기를 시도하면 그 시점에서 파일 *을 계속 열 수 있습니다 (그렇지 않은 경우에도 가능). 오래 동안). –

2

예외가 throw되지 않은 경우 (사용자가 알고 있다고 가정했을 때) renameTo()은 true 또는 false 만 반환하여 이름 변경이 성공했는지 여부를 나타내며 추가 정보를 제공하지 않습니다.

Windows이므로 오류는 파일이 현재 사용 중임을 나타냅니다. 일부 다른 프로세스가 열려 있기 때문에 이런 일이 발생합니다. 더 많은 가능성이 있지만, 당신의 프로세스가 그것을 작성하지 않았거나 당신이 그것을 작성한 후에 파일을 닫는 것을 잊었습니다.

유효하지 않은 경로를 전달했거나 File 생성자에 존재하지 않는 경로를 제공했을 수도 있습니다.

renameTo()은 보안 위반 (SecurityException)이 있거나 파일 이름을 바꾸는 데 null을 전달한 경우에만 예외를 throw합니다.

+1

나는 그것이 false를 반환한다는 것을 알고 있지만, 그것이 실패한 이유를 전혀 모른다. 모든 outputStream.close()를 닫고 null로 설정했습니다. 그러나 그것은 여전히 ​​무작위로 실패했다. file0.tmp ... file9.tmp라는 10 개의 파일을 생성했다고 가정 해 봅시다. file5.tmp가 file5.txt로 변경되지 않았을 수 있습니다. – janetsmith

1

비슷한 문제가 있었지만 유닉스와 관련이 있습니다.
이름을 임의로 변경하지 못했습니다. 나는 3 ~ 4 번 과정을 다시 시작했고 마침내 성공했다.
참고로 동일한 프로세스에서 파일을 만들고 동일한 프로세스에서 이름을 바꿉니다.

-4

파일 f = 새 파일 (폴더 + 파일); 올바른 경로를 입력했는지 확인하십시오 .. f.exists(); else가 존재하면 procMon이 false 인 경우 false를 반환합니다.

2
File o=new File("d:/old.txt"); 
File n=new File("d:/new.txt"); 
n.delete(); 
o.renameTo(n); 

n.delete() : 우리는 존재하는 경우 파일 (new.txt)을 삭제해야합니다.

o.rename(n) : 파일 (old.txt) renameTo가 실패 할 수 있습니다 new.txt

+2

나는 그 일을했고 여전히 이름 바꾸기에서 거짓으로 돌아왔다. 파일이 닫혀 있었고 다른 어떤 것도 가지고 있지 않았다. 윈도우. 그냥 ... 윈도우. – stu

3

3 개 이유로 이름이 변경되도록 (안드로이드에 대한,하지만 당신은이 유용 할 수 있습니다)!

1) a에서 b로 폴더를 이동하는 경우 대상 폴더는 파일 일 수 있습니다! destinationFolder.mkdirs()를 파일로 만드십시오!

2) 대상 폴더가 이미 존재할 수 있습니다! renameTo를 사용하여 이전 위치의 파일을 옮길 수 있도록 destinationFolder를 삭제하십시오.

3) SD 카드에 읽기 및 쓰기 권한이 필요하므로 외부 저장소로 내부 저장소를 이동하려면 권한이 필요합니다!

+0

구글을 통해이 질문을 찾았고 # 2가 내 문제였다. . 도와 줘서 고마워! –

+1

"파일을 만들기 위해 destinationFolder.mkdirs() 만들기"! – EntangledLoops

관련 문제