2010-03-25 28 views
6

Từ Java, tôi trích xuất một tệp thực thi vào một vị trí được chỉ định bằng File.createTempFile(). Khi tôi cố chạy chương trình thực thi của mình, chương trình của tôi bị treo khi nó cố đọc dòng đầu tiên đầu ra.Làm thế nào để loại bỏ tên tệp Windows trong Java?

Tôi đã phát hiện ra rằng nếu tôi cố gắng chạy cùng một tệp thực thi được trích xuất từ ​​một chương trình khác, nó hoạt động nếu tôi chỉ định thư mục là C: \ Documents and Settings \ username \ Local Settings \ Temp \ prog.exe. Nhưng nếu tôi chỉ định thư mục là C: \ DOCUME ~ 1 \ USERNA ~ 1 \ LOCALS ~ 1 \ Temp \ prog.exe Tôi sẽ bị treo.

Có cách nào để gỡ bỏ tên tệp tilde trong chương trình của tôi để tôi có thể chỉ định tên thư mục sẽ hoạt động không?

(Và kể từ khi tôi luôn luôn như giải quyết các vấn đề thiết kế ngôn ngữ và API, là có bất kỳ lý do tại sao Java File.createTempFile() và java.io.tmpdir phải đánh giá để tên tập tin đã bị đọc sai?)

Trả lời

10

Bạn có thể sử dụng getCanonicalPath() để có đường dẫn mở rộng. Ví dụ .:

try 
{ 
    File file = File.createTempFile("abc", null); 
    System.out.println(file.getPath()); 
    System.out.println(file.getCanonicalPath()); 
} 
catch (IOException e) {} 

... sản xuất ...

C:\DOCUME~1\USERNA~1\LOCALS~1\Temp\abc49634.tmp 
C:\Documents and Settings\username\Local Settings\Temp\abc49634.tmp 

Tôi thử nghiệm này trên XP, nhưng cho rằng nó sẽ làm việc tương tự như trên hệ điều hành Windows khác.

Xem câu trả lời của @ raviaw cho câu hỏi thứ hai của bạn.

+0

Câu trả lời hay hơn tôi, mặc dù tôi nghi ngờ đây là vấn đề của anh ấy. –

+0

Điều đó thực sự dường như làm xáo trộn tên tập tin! Bằng cách nào đó nó vẫn treo khi tôi chạy, mặc dù. Tôi không hiểu tại sao, nhưng, nhưng làm việc trên nó ... – skiphoppy

+0

Ah hah! Tôi đã phải gọi close() trên OutputStream mà tôi đã sử dụng khi trích xuất tệp thực thi. Hóa ra bài kiểm tra của tôi, tôi vô tình chuyển tên tệp bị xén cho một tệp thi hành vẫn đang được sử dụng (và không đóng()) và chuyển tên tệp đầy đủ cho lần khai thác trước đó không còn được sử dụng nữa. – skiphoppy

3

Ồ, tôi chưa bao giờ thấy điều đó. Thực tế là các biến môi trường% TEMP% trả về một tên đọc sai (đây là từ máy tính của tôi):

 
TEMP=C:\DOCUME~1\raviw\LOCALS~1\Temp 
TMP=C:\DOCUME~1\raviw\LOCALS~1\Temp 

Giả sử rằng một java mới tạo VM sử dụng biến môi trường để có được những vị trí thư mục tạm thời, nó không phải là Lỗi của VM là các thư mục bị xáo trộn.

Và ngay cả khi bạn cố gắng sử dụng System.getenv() để nhận thư mục tạm thời, bạn vẫn sẽ gặp phải vấn đề tương tự.

tôi sẽ đảm bảo rằng:

  • Vấn đề không phải là do thực tế là bạn có một thư mục gọi là "prog.exe" (dựa trên câu hỏi của bạn, tôi giả định này);
  • Nếu tệp là "prog.exe", nếu nó không được sử dụng bởi bất kỳ chương trình nào khác (có thể là phần mềm diệt vi-rút);
  • Kiểm tra xem máy tính của bạn có lành mạnh không (đây sẽ là lỗi rất quan trọng đối với mọi ứng dụng không phải là ứng dụng web và cần các tệp tạm thời).
+0

+1 cho câu trả lời cho câu hỏi thứ hai của mình mà tôi quên để giải quyết. – Chris

+0

Hóa ra nó đang được sử dụng bởi một chương trình khác ... ứng dụng tôi đang viết.Mà đã trích xuất nó, và không bao giờ được gọi là gần(). Vì vậy, tất cả các cuộc gọi để cố gắng chạy nó, cho dù từ thử nghiệm của tôi hoặc từ các ứng dụng, được treo vô thời hạn chờ đợi cho rằng gần() và kết quả tuôn ra đĩa. – skiphoppy

Các vấn đề liên quan