2012-03-23 3 views
2

디렉토리에 많은 수의 파일을 처리하는 응용 프로그램을 작성 중입니다. 내 응용 프로그램에서 처리하는 각 파일의 정규화 된 경로를 데이터베이스에 삽입하려고합니다. 응용 프로그램에서 이미 처리 한 파일을 사용자가 다시 처리하기 위해 다시 제출하는 경우 파일의 정규화 된 경로를 지정하여 데이터베이스에서 파일에 대해 처리 된 모든 데이터를 삭제 한 다음 새 파일 인 것처럼 파일플랫폼 특정 경로를 Java 데이터베이스에 삽입하는 방법

내가 직면하고 문제는 내가 이클립스를 통해 응용 프로그램을 실행할 때 다음과 같이 데이터베이스에 삽입 경로 이름이 있다는 것입니다 : -

나는 그것의 경로와 파일 이름을 연결 Afer 즉
D:\Trunk\App\Source 

(pathString + File.seperator + fileNameString) 즉, 데이터베이스에 삽입 완전한 경로는

D:\Trunk\App\Source/file1.txt 

다음 있지만 나는 내 응용 프로그램에 대한 항아리를 만들고 항아리를 두 번 클릭하여 항아리를 실행하는 경우, 경로 이름 데이터베이스에 삽입 된 데이터는 fol 최저 : - 나는 그것의 경로 (pathString + File.seperator + fileNameString)와 파일 이름을 연결 한 후

D:/Trunk/App/Source 

즉, 데이터베이스에 삽입 정규화 된 경로는

D:/Trunk/App/Source/file1.txt 

응용 프로그램을 다음과 같다 응용 프로그램이 eclipse에서 응용 프로그램을 실행하는 대신 jar를 두 번 눌러 실행하는 경우 처리를 위해 다시 제출 된 파일의 데이터를 삭제하지 못합니다. 삭제에 사용되는 쿼리는 관계없이 그냥 모든 "\" 당신이 처리하는 모든 파일 경로에 대한 "/"에 또는 그 반대로 변환 항아리

delete from file_table where where file = 'D:\Trunk\App\Source/file1.txt' 
+2

당신은 파일 분리기의 한 종류에 충실하지 못할? 예. 삽입하는 동안 및 데이터베이스를 확인하는 동안 모두 /로 변환하십시오. –

+0

그럴 수 있습니다. 내 응용 프로그램이 일단 모든 파일 처리를 완료하면 .csv 보고서를 생성하지만. 이 보고서에는 열 중 하나에있는 각 파일의 경로가 들어 있습니다. 이것은 내가 직면하고있는 두 번째 문제, 즉 보고서에 표시된 경로가보다 의미있는 플랫폼 특정이어야 함을 의미합니다. – CKing

답변

1

경로를 URI로 변환하고 데이터베이스에 저장하십시오. 그런 다음 URI에서 파일을 다시 만듭니다.

String uriName = new File(path).toURI().toString()

String path = new File(new URI(uriName)).getAbsolutePath();

+0

이것은 Windows에서의 매력처럼 작동하는 것 같습니다. 내 컴퓨터의 Linux 파티션이 Linux에서이를 테스트하기에 충분한 공간이 없습니다. 이 기능은 Linux에서도 작동합니까? 또한, 나는 URI를 사용하는 대신 직접 file.getAbsolutePath를 시도 했으므로이 방법으로도 작동하는 것으로 보입니다. 직접적으로 file.getAbsolutePath를 사용하는 것과 비교하여 toURI 메소드와 URI 클래스가 제공하는 이점은 무엇입니까? – CKing

+0

유닉스에서 작동합니다. 대신 File.getCanonicalPath()를 사용할 수 있습니다. URI (URL은 더 이상 사용되지 않음)는 항상 'file :/home/user/workspace/a.txt' 형식을 "/"로 사용합니다. "\"로 변환 할 필요가 없습니다. –

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 /를 구분 기호로 사용하고 file.getAbsolutePath를 호출 중이며 Windows에서 제대로 작동하는 것으로 보입니다. file.getAbsolutePath를 file.getCanonicalPath로 변경하여 안전한쪽으로 변경해야합니까? – CKing

2

일식 또는 두 번 클릭하여 응용 프로그램을 실행하는 동일합니다.

+0

이것이 유효한 해결책이긴하지만 좀 더 일반적인 해결책을 찾고 있습니다. 내 응용 프로그램 전체에서 명시 적으로 대체를 수행하십시오. – CKing

관련 문제