2013-07-30 95 views
11

Tôi đã tạo một ứng dụng java thuần túy cho tôi biết về số lượng tệp trong một thư mục nhất định. Bây giờ tôi đặt thư mục hiện hành bằng cách sử dụng đoạn mã sau:Cách lấy đường dẫn thư mục thực hiện trong java

`File f = new File(".");` 

Sau đó tôi đã thực hiện một trình cài đặt với file jar của nó và cài đặt nó trong cửa sổ của tôi 8 và sau đó tôi thêm nó vào cửa sổ kích chuột phải vào trình đơn thả xuống (bối cảnh thực đơn). Khi tôi khởi động nó từ trình đơn ngữ cảnh, nó luôn cho tôi biết về số lượng tệp trong thư mục mà nó thực sự được cài đặt, tuy nhiên tôi muốn biết số lượng tệp của thư mục đó từ nơi tôi đang thực thi nó.

Vì vậy, plz giúp tôi. Tôi là một người mới trong lĩnh vực này và tôi không muốn bạn nhầm lẫn tôi trong thư mục hiện tại và thư mục thực thi hiện tại. Vì vậy, tôi viết điều này rất lâu và hy vọng cho một câu trả lời sạch sẽ trong những từ rất đơn giản.

Cảm ơn

+0

Would [hướng dẫn này] (http: // www. howtogeek.com/howto/windows-vista/add-any-application-to-the-desktop-right-click-menu-in-vista/) giúp bạn? – mthmulders

+0

Mã bit nhỏ sẽ rất hữu ích để nhận được câu trả lời của bạn –

+0

@abu có nó được biên dịch cho tôi. Tôi khuyên u nên thử nó và tôi chắc chắn jdk sẽ không làm bất kỳ một phần với u. –

Trả lời

15

Như Jarrod Roberson nói trong his answer here:

Một cách sẽ sử dụng system property System.getProperty("user.dir"); điều này sẽ cung cấp cho bạn "Danh bạ hiện tại khi các thuộc tính được khởi tạo". Đây là có thể là những gì bạn muốn. để tìm ra nơi lệnh java được phát hành , trong trường hợp của bạn trong thư mục có tệp để xử lý, ngay cả mặc dù tệp .jar thực tế có thể nằm ở một nơi khác trên máy . Có thư mục của tệp .jar thực tế không phải là hữu ích trong hầu hết các trường hợp.

Sau đây sẽ in ra thư mục hiện hành từ nơi lệnh được gọi bất kể nơi .class hoặc file .jar các tập tin .class là trong.

public class Test 
{ 
    public static void main(final String[] args) 
    { 
     final String dir = System.getProperty("user.dir"); 
     System.out.println("current dir = " + dir); 
    } 
} 

nếu bạn đang ở trong /User/me/ và bạn .jar tệp có chứa mã trên nằm trong số /opt/some/nested/dir/ lệnh java -jar /opt/some/nested/dir/test.jar Test sẽ xuất ra current dir = /User/me.

Bạn cũng nên xem xét phần thưởng bằng cách sử dụng trình phân tích đối số dòng lệnh đối tượng tốt. Tôi rất khuyên bạn nên JSAP, Java Trình phân tích đối số đơn giản. Điều này sẽ cho phép bạn sử dụng System.getProperty("user.dir") và cách khác chuyển vào một số nội dung khác để thực hiện hành vi quá mức. Một giải pháp bền vững hơn nhiều. Điều này sẽ làm cho việc đi qua trong thư mục để xử lý rất dễ thực hiện, và có thể quay trở lại trên user.dir nếu không có gì được chuyển vào.

Ví dụ: GetExecutionPath

import java.util.*; 
import java.lang.*; 

public class GetExecutionPath 
{ 
    public static void main(String args[]) { 
    try{ 
     String executionPath = System.getProperty("user.dir"); 
     System.out.print("Executing at =>"+executionPath.replace("\\", "/")); 
    }catch (Exception e){ 
     System.out.println("Exception caught ="+e.getMessage()); 
    } 
    } 
} 

đầu ra cho các bên trên sẽ như thế nào

C:\javaexamples>javac GetExecutionPath.jav 

C:\javaexamples>java GetExecutionPath 
Executing at =>C:/javaexamples 
+2

'System.getProperty (" user.dir ")' và 'new File (". ")' [Thường trả về cùng một giá trị] (http://docs.oracle.com/javase/7/docs/api/java /io/File.html). Vì vậy, tại sao điều này sẽ làm việc, trong khi 'tập tin mới (". ")' Không, theo câu hỏi? – mthmulders

+0

Một lần nữa, bạn không thể chỉ cần ném một liên kết ở phần cuối của một câu trả lời mà bạn đã sao chép từ ngữ của người khác. Bạn phải trích dẫn rõ ràng ngôn ngữ đã sao chép để mọi người biết đó không phải là đóng góp ban đầu của bạn. –

3

Sau đây có thể giúp bạn

System.getProperty("user.dir") 

này sẽ trả lại cho bạn những con đường như một chuỗi

+0

có người đàn ông tôi đã làm điều này quá, và rõ ràng là tôi đã nhận được đường dẫn trong chuỗi nhưng tôi muốn biết đường dẫn của thư mục đó từ nơi tôi đang thực hiện nó không phải là dirctory nơi nó được cài đặt trong –

+0

@Mohd Faizan Khan, i không chắc chắn về yêu cầu của bạn. Bạn có đường dẫn cài đặt trước khi thực hiện? – Karthikeyan

+0

'System.getProperty (" user.dir ")' và 'new File (". ")' [Thường trả về cùng một giá trị] (http://docs.oracle.com/javase/7/docs/api/java /io/File.html). Vì vậy, tại sao điều này sẽ làm việc, trong khi 'tập tin mới (". ")' Không, theo câu hỏi? – mthmulders

0

Có một vài điều khác nhau mà bạn có thể quan tâm:

  • Nhận thư mục làm việc hiện tại: String workingDir = System.getProperty("user.dir");

  • Nhận lớp nạp đường dẫn: URL resource = classLoader.getResource("/");

+0

'System.getProperty (" user.dir ")' và 'new File (". ")' [Thường trả về cùng một giá trị] (http://docs.oracle.com/javase/7/docs/api/java /io/File.html). Vì vậy, tại sao điều này sẽ làm việc, trong khi 'tập tin mới (". ")' Không, theo câu hỏi? – mthmulders

5

Bạn có thể làm một số công cụ điên:

String absolute = getClass().getProtectionDomain().getCodeSource().getLocation().toExternalForm(); 
absolute = absolute.substring(0, absolute.length() - 1); 
absolute = absolute.substring(0, absolute.lastIndexOf("/") + 1); 
String configPath = absolute + "config/file.properties"; 
String os = System.getProperty("os.name"); 
if (os.indexOf("Windows") != -1) { 
    configPath = configPath.replace("/", "\\\\"); 
    if (configPath.indexOf("file:\\\\") != -1) { 
     configPath = configPath.replace("file:\\\\", ""); 
    } 
} else if (configPath.indexOf("file:") != -1) { 
    configPath = configPath.replace("file:", ""); 
} 

Tôi sử dụng này để đọc ra một relativ tập tin cấu hình để con đường thực hiện. Bạn cũng có thể sử dụng nó để có được đường dẫn thực thi của tệp jar của bạn.

0

File Javadoc cho biết rằng tệp tương đối thường được giải quyết dựa vào thư mục người dùng hiện tại. Nó tiếp tục:

Thư mục này được đặt tên theo thuộc tính hệ thống user.dir và thường là thư mục trong đó máy ảo Java được gọi.

Vì vậy, sau đó cả hai new File(".") hoặc System.getProperty("user.dir"); sẽ trả về cùng một kết quả. Theo câu hỏi, bạn đang chạy từ trình đơn ngữ cảnh của trình khám phá Windows, có thể hơi khác một chút so với lời gọi JVM bình thường.

Những gì bạn cần phải làm, theo this tutorial, như sau:

  1. Tạo một khóa registry mới bên dưới HKEY_CLASSES_ROOT\Directory\Background\shell. Tên của nó sẽ được sử dụng trên menu ngữ cảnh Explorer, vì vậy, hãy đặt tên cho giá trị MyJavaApp.
  2. Tạo khóa đăng ký mới bên dưới HKEY_CLASSES_ROOT\Directory\Background\shell\MyJavaApp và đặt tên là command. Giá trị của nó phải là đường dẫn đầy đủ đến ứng dụng Java của bạn. Bạn có thể thêm %1 vào lệnh làm trình giữ chỗ cho tệp/thư mục hiện được chọn. Điều này có nghĩa là chương trình của bạn sẽ được gọi với một đối số bổ sung.
  3. Chương trình của bạn có thể đọc đối số bổ sung để xác định thư mục nào được gọi từ đó.

Lưu ý rằng các bước trên (và hướng dẫn) dành cho Windows Vista, vì vậy bạn có thể muốn kiểm tra lại nó cũng làm việc cho Windows 8.

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