2010-07-15 78 views
24

Nếu tôi có tệp thực thi được gọi là app.exe, đó là những gì tôi đang mã hóa trong C#, làm cách nào để lấy tệp từ thư mục được tải trong cùng thư mục với app.exe, sử dụng đường dẫn tương đối?Cách lấy tệp trong đường dẫn tương đối trong C#

này ném một nhân vật bất hợp pháp trong con đường ngoại lệ:

string [ ] files = Directory.GetFiles ("\\Archive\\*.zip"); 

Làm thế nào người ta sẽ làm điều này trong C#?

Trả lời

34

Để đảm bảo bạn có con đường của ứng dụng (và không chỉ thư mục hiện hành), sử dụng này:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.getcurrentprocess.aspx

Bây giờ bạn có một đối tượng Process đại diện cho quá trình đang chạy.

Sau đó sử dụng Process.MainModule.FileName:

http://msdn.microsoft.com/en-us/library/system.diagnostics.processmodule.filename.aspx

Cuối cùng, sử dụng Path.GetDirectoryName để có được thư mục chứa .exe:

http://msdn.microsoft.com/en-us/library/system.io.path.getdirectoryname.aspx

Vì vậy, đây là những gì bạn muốn:

string folder = Path.GetDirectoryName(Process.GetCurrentProcess().MainModule.FileName) + @"\Archive\"; 
string filter = "*.zip"; 
string[] files = Directory.GetFiles(folder, filter); 

(Chú ý rằng "\Archive\" từ câu hỏi của bạn tại là @"\Archive\": bạn cần @ để các \ backslashes không hiểu là sự bắt đầu của một dãy thoát)

Hy vọng rằng sẽ giúp!

+6

Path.GetDirectoryName (Assembly.GetEntryAssembly(). Location); là đơn giản hơn. –

+0

@Mikael, Đồng ý, sẽ cố gắng cập nhật câu trả lời này ngay –

+0

Làm thế nào để bạn làm điều đó cho một thư mục ảo nằm trong thư mục gốc của ứng dụng web được ánh xạ tới đường dẫn UNC? – ppumkin

29
string currentDirectory = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
string archiveFolder = Path.Combine(currentDirectory, "archive"); 
string[] files = Directory.GetFiles(archiveFolder, "*.zip"); 

Tham số đầu tiên là đường dẫn. Thứ hai là mẫu tìm kiếm bạn muốn sử dụng.

+0

Thêm vào comment Kieren của: có cũng những thứ như OpenFileDialog và SaveFileDialog mà có thể thay đổi thư mục hiện tại thời gian chạy. (nếu thuộc tính RestoreDirectory được để lại với giá trị mặc định là false). –

+0

Điểm công bằng. Tôi đã cập nhật câu trả lời của mình. @Moe: Tốt để biết. Tôi không biết RestoreDirectory đã tồn tại. –

+0

Hơi tắt chủ đề: lưu ý rằng nếu bạn muốn các tệp trong thư mục hiện tại, bạn không thể chuyển một chuỗi rỗng làm đối số đường dẫn đến Directory.GetFiles, nhưng "." công trinh. – yoyo

14

Viết nó như thế này:

string[] files = Directory.GetFiles(@".\Archive", "*.zip"); 

. là liên quan đến thư mục nơi bạn bắt đầu exe của mình và @ để cho phép \ trong tên.

Khi sử dụng bộ lọc, bạn chuyển nó làm tham số thứ hai. Bạn cũng có thể thêm tham số thứ ba để xác định xem bạn có muốn tìm kiếm đệ quy cho mẫu không.

Để có được thư mục mà .exe của bạn thực sự cư trú, sử dụng:

var executingPath = Path.GetDirectoryName(Assembly.GetEntryAssembly().Location); 
+0

. \ Có nghĩa là liên quan đến thư mục hiện tại, tôi nghĩ vậy? –

+0

Một dấu chấm đơn (.) Có thể đứng trong thư mục hiện tại. Hai dấu chấm (..) có nghĩa là phụ huynh của thư mục hiện tại. –

+0

Chính xác, nhưng câu hỏi đang nói về tương đối với tệp thực thi, không phải thư mục hiện tại ..? –

2

Như những người khác đã nói, bạn có thể/nên thêm chuỗi ký tự với @ (mặc dù bạn cũng có thể chỉ thoát khỏi dấu gạch chéo ngược), nhưng những gì chúng bị che khuất (nghĩa là, không mang nó lên mặc dù thực hiện thay đổi liên quan đến nó) là một thực tế, như tôi đã phát hiện gần đây, sử dụng \ ở đầu của một tên đường dẫn, không có . để đại diện cho thư mục hiện tại, đề cập đến gốc của cây thư mục hiện hành.

C:\foo\bar>cd \ 
C:\> 

so

C:\foo\bar>cd .\ 
C:\foo\bar> 

(Sử dụng . bởi chính nó có tác dụng tương tự như sử dụng .\ bởi chính nó, từ kinh nghiệm của tôi. Tôi không biết nếu có bất kỳ trường hợp cụ thể mà họ bằng cách nào đó sẽ không có nghĩa là cùng một điều.)

Bạn cũng có thể chỉ cần rời khỏi hàng đầu .\, nếu bạn muốn.

C:\foo>cd bar 
C:\foo\bar> 

Thực tế, nếu bạn thực sự muốn, bạn thậm chí không cần sử dụng dấu gạch chéo ngược. Forwardslashes hoạt động hoàn hảo tốt! (Mặc dù một đơn / không alias vào thư mục gốc ổ đĩa hiện hành như \ làm.)

C:\>cd foo/bar 
C:\foo\bar> 

Bạn thậm chí có thể luân phiên chúng.

C:\>cd foo/bar\baz 
C:\foo\bar\baz> 

... Tôi thực sự đã bỏ qua chủ đề ở đây, mặc dù vậy, hãy bỏ qua tất cả điều này nếu bạn không quan tâm.

0

Khá thẳng về phía trước, sử dụng đường dẫn tương đối

string[] offerFiles = Directory.GetFiles(Server.MapPath("~/offers"), "*.csv"); 
Các vấn đề liên quan