Mở thư mục bằng Process.Start


148

Tôi thấy chủ đề khác và tôi đang gặp vấn đề khác. Quá trình đang bắt đầu (đã thấy ở trình quản lý tác vụ) nhưng thư mục không mở trên màn hình của tôi. Chuyện gì vậy?

System.Diagnostics.Process.Start("explorer.exe", @"c:\teste");

bạn có chắc chắn con đường của bạn là chính xác?
Nathan Koop

1
Tại sao bạn muốn gọi Explorer bằng tay? Tại sao không chỉ mở thư mục, tức là gọi Process.Start với ProcessStartInfo với UseShellExecute được đặt thành true và Verb được đặt thành "open"?
OregonGhost

1
Có, tôi đã thử mở 'explorer.exe' mà không có đường dẫn và cũng không hoạt động.
Daniel

Chà, tôi không đăng bài vì câu hỏi không phải là làm thế nào để mở thư mục, mà là làm thế nào để chạy explorer.exe để mở thư mục. Tôi chỉ muốn biết lý do tại sao bạn muốn gọi thám hiểm trực tiếp ngay từ đầu, bởi vì có thể có một lý do;)
OregonGhost

Tôi chỉ muốn loại trừ các tùy chọn ở đây, vì vậy đây có thể là một câu hỏi ngu ngốc: bạn không làm điều này trong Linux bằng cách sử dụng đơn âm, phải không? Chúng ta đang nói về một môi trường Windows?
Fredrik Mörk

Câu trả lời:


266

Bạn đã chắc chắn rằng thư mục " c:\teste" tồn tại? Nếu không, explorer sẽ mở hiển thị một số thư mục mặc định (trong trường hợp của tôi " C:\Users\[user name]\Documents").

Cập nhật

Tôi đã thử các biến thể sau:

// opens the folder in explorer
Process.Start(@"c:\temp");
// opens the folder in explorer
Process.Start("explorer.exe", @"c:\temp");
// throws exception
Process.Start(@"c:\does_not_exist");
// opens explorer, showing some other folder)
Process.Start("explorer.exe", @"c:\does_not_exist");

Nếu không có cái nào trong số này (tốt, ngoại trừ cái nào ném ngoại lệ) hoạt động trên máy tính của bạn, tôi không nghĩ rằng vấn đề nằm ở mã, nhưng trong môi trường. Nếu đó là trường hợp, tôi sẽ thử một (hoặc cả hai) sau đây:

  • Mở hộp thoại Run, nhập "explorer.exe" và nhấn enter
  • Mở một dấu nhắc lệnh, gõ "explorer.exe" và nhấn enter

Chà, tôi chắc chắn và nếu nó không tồn tại, sẽ mở bất kỳ thư mục nào theo cùng một cách, hay không?
Daniel

Chà, đó có thể là vấn đề môi trường đó là một ngoại lệ
Daniel

1
Sự khác biệt nhỏ nếu cửa sổ explorer đó đã mở: Process.Start(path) kích hoạt cửa sổ (chỉ có thể nhấp nháy trên thanh tác vụ, không được đưa ra phía trước); explorer.exe+ tham số mở một cửa sổ mới luôn ở phía trước (nhưng nhiều lần trong cùng một cửa sổ). Vì vậy, cả hai đều có sự cẩn thận.
KekuSemau

Process.Start(@"c:\temp")phải được sử dụng một cách thận trọng. Nếu c:\temp.comtồn tại, sau đó chức năng gọi sẽ mở c:\temp.com. Xem diễn đàn.iis.net / p / 1239773 / 2144186.aspx để biết thêm chi tiết.
Lex Li

Lưu ý rằng Process.Start(@"c:\temp")dễ bị mở một thư mục khác như C:\temp.exe, hoặc C:\temp.cmd. Xem vấn đề này trong đó bản thân VS thể hiện hành vi lỗi . Bạn có thể tránh điều này bằng cách sử dụng explorer.exebiến thể hoặc (tốt hơn, IMO) luôn luôn nối thêm a Path.DirectorySeparatorChar. Ví dụ , Process.Start(@"C:\temp\").
binki

46

Để hoàn thiện, nếu tất cả những gì bạn muốn làm là mở một thư mục, hãy sử dụng điều này:

System.Diagnostics.Process.Start(new System.Diagnostics.ProcessStartInfo() {
    FileName = "C:\\teste\\",
    UseShellExecute = true,
    Verb = "open"
});

Đảm bảo FileName kết thúc với Path.DirectorySeparatorCharđể làm cho nó rõ ràng trỏ đến một thư mục. (Cảm ơn @binki.)

Giải pháp này sẽ không hoạt động để mở thư mục và chọn một mục, vì dường như không có động từ cho điều đó.


Điều này làm việc cho tôi, cả trên Windows và Linux bằng Mono.
Menno Deij - van Rijswijk

1
Nếu bạn sử dụng phương thức này và một thư mục như C:\teste.exehoặc C:\teste.cmdtồn tại, Explorer sẽ mở sang thư mục khác thay vì thư mục bạn dự định. Để tránh điều này, bạn có thể nối thêm một Path.DirectorySeparatorCharđường dẫn. Xem cách VS tự mắc lỗi tương tự .
binki

Đưa ra câu trả lời của @ Scyssion bằng cách sử dụng "/ select", bạn nghĩ rằng bạn có thể sử dụng Verb = "select", nhưng than ôi bạn không thể. Bất kể, câu trả lời tuyệt vời!
idbrii

1
Điều này làm việc cho tôi trong .NET Core 3, không giống như câu trả lời được chấp nhận ở trên. Cài đặt Verb = "open"là không cần thiết. (Được thử nghiệm trong Windows, các hệ điều hành khác có thể khác.)
Walt D

Bạn có thể nhận các động từ áp dụng từ .Verbstài sản trên ProcessStartInfo( docs.microsoft.com/en-us/dotnet/api/ mẹo )
GaryNg

16

Nếu bạn muốn chọn tệp hoặc thư mục, bạn có thể sử dụng như sau:

Process.Start("explorer.exe", "/select, c:\\teste");

2
Để mở thư mục thay vì chọn, chỉ cần thay đổi /selectthành/open
SushiGuy

5

Bạn đang sử dụng biểu tượng @, loại bỏ nhu cầu thoát dấu gạch chéo ngược của bạn.

Xóa @ hoặc thay thế \ bằng \


Vẫn không mở thư mục .. Chỉ bắt đầu quá trình quản lý tác vụ @
Daniel

Tôi không có đề xuất nào thêm, tôi đã có thể thử nghiệm và làm cho nó hoạt động trong Visual C # express 2008
Kevin Laity

1
Tôi sẽ nói ... ngựa vằn. Có điều gì đó không ổn với nhà thám hiểm của bạn, có thể là virii hoặc đôi khi ...
R. Martinho Fernandes

4

Bạn không cần dấu gạch chéo kép khi sử dụng các chuỗi không thoát:

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

3

Bạn nên sử dụng một trong những System.Diagnostics.Process.Start()quá tải. Nó khá đơn giản!

Nếu bạn không đặt tên tệp của quy trình bạn muốn chạy ( explorer.exe), hệ thống sẽ nhận ra đó là đường dẫn thư mục hợp lệ và cố gắng gắn nó vào quy trình Explorer đã chạy. Trong trường hợp này, nếu thư mục đã mở, Explorer sẽ không làm gì cả.

Nếu bạn đặt tên tệp của quy trình (như bạn đã làm), hệ thống sẽ cố gắng chạy một phiên bản mới của quy trình, chuyển chuỗi thứ hai làm tham số. Nếu chuỗi là một thư mục hợp lệ, nó được mở trên quy trình mới được tạo, nếu không, quy trình mới sẽ không làm gì cả.

Tôi không biết làm thế nào các đường dẫn thư mục không hợp lệ được xử lý theo quy trình trong mọi trường hợp. Sử dụng System.IO.Directory.Exists()phải đủ để đảm bảo rằng.


Đừng quên rằng bạn cần phải nối thêm a Path.DirectorySeparatorChar. Mặt khác, nếu một thư mục có cùng tên nhưng .cmdhoặc .execó thể có các hậu tố khác cũng tồn tại, Explorer sẽ mở vào thư mục đó khác hoặc nếu đó là các tập lệnh hoặc tập lệnh thực sự, nó sẽ chạy chúng thay vì mở thư mục như bạn dự định.
binki 14/11/18

1

Sử dụng một phiên bản quá tải của phương thức lấy một đối tượng ProcessStartInfo và đặt thuộc tính ProcessWindowStyle thành một giá trị phù hợp với bạn.


1

Bạn đang thoát khỏi dấu gạch chéo ngược khi dấu hiệu thực hiện điều đó cho bạn.

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

1
System.Diagnostics.Process.Start("explorer.exe",@"c:\teste"); 

Mã này hoạt động tốt từ môi trường VS2010 và mở thư mục cục bộ đúng cách, nhưng nếu bạn lưu trữ cùng một ứng dụng trong IIS và cố gắng mở thì chắc chắn sẽ thất bại.


1

Ive chỉ có vấn đề này, và tôi đã tìm ra lý do tại sao. lý do của tôi không được liệt kê ở đây vì vậy bất cứ ai khác có vấn đề này và không ai trong số này khắc phục nó.

Nếu bạn chạy Visual Studio với tư cách là một người dùng khác và cố gắng sử dụng Process. Bắt đầu, nó sẽ chạy trong ngữ cảnh người dùng đó và bạn sẽ không thấy nó trên màn hình của mình.


0

Lạ thật.

Nếu nó không thể tìm thấy explorer.exe, bạn sẽ có một ngoại lệ. Nếu không thể tìm thấy thư mục, nó vẫn sẽ mở một số thư mục (ví dụ: Tài liệu của tôi)

Bạn nói rằng một bản sao khác của Explorer xuất hiện trong taskmanager, nhưng bạn không thể nhìn thấy nó.

Có thể là nó đang mở màn hình (tức là một màn hình khác)?

Hoặc bạn có bất kỳ cơ hội làm điều này trong một dịch vụ không tương tác?


Tôi chỉ có 1 màn hình và "Bạn nói rằng một bản sao khác của Explorer xuất hiện trong taskmanager, nhưng bạn không thể nhìn thấy nó." Điều này đúng .. Tôi không biết ý của bạn là gì "Hay bạn có thể làm điều này trong một dịch vụ không tương tác?"
Daniel

Ý tôi là nếu chương trình bạn đang viết là một dịch vụ (theo mặc định chạy hoàn toàn trong nền) trái ngược với chương trình winforms thông thường. (Nếu bạn không biết dịch vụ là gì, không chắc bạn đang viết một dịch vụ). Quay trở lại taskmanager, nếu bạn chọn 'chuyển sang', 'đưa ra phía trước' hoặc 'tối đa hóa' trên cửa sổ thám hiểm ẩn này, nó có xuất hiện không?
sgmoore

0

Nó có mở đúng khi bạn chạy "explorer.exe c: \ teste" từ menu bắt đầu không? Bao lâu bạn đã thử điều này? Tôi thấy một hành vi tương tự khi máy của tôi có nhiều quy trình và khi tôi mở một quy trình mới (bộ nói IE) .. nó khởi động trong trình quản lý tác vụ nhưng không hiển thị ở giao diện người dùng. Bạn đã thử khởi động lại chưa?

Đoạn mã sau sẽ mở một thể hiện explorer mới

class sample{

static void Main()
{
  System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");
}
}

0

Bạn có rất nhiều ứng dụng đang chạy khi bạn đang thử điều này? Đôi khi tôi gặp phải hành vi kỳ lạ tại nơi làm việc vì hệ thống của tôi hết GDI Handles vì ​​tôi có quá nhiều cửa sổ mở (ứng dụng của chúng tôi sử dụng rất nhiều).

Khi điều này xảy ra, các cửa sổ và menu ngữ cảnh sẽ không xuất hiện cho đến khi tôi đóng thứ gì đó để giải phóng một số tay cầm GDI.

Giới hạn mặc định trong XP và Vista là 10000. Không có gì lạ khi DevStudio của tôi có 1500 tay cầm GDI, vì vậy nếu bạn mở một vài bản sao của Dev studio, nó có thể ăn chúng khá nhanh. Bạn có thể thêm một cột trong Trình quản lý tác vụ để xem có bao nhiêu tay cầm đang được sử dụng bởi mỗi quy trình.

Có một tinh chỉnh registry bạn có thể làm để tăng giới hạn.

Để biết thêm thông tin, hãy xem http://msdn.microsoft.com/en-us/l Library / ms724291 (VS85) .aspx


0

System.Diagnostics.Process.Start("explorer.exe",@"c:\teste");

Chỉ cần thay đổi đường dẫn hoặc khai báo nó trong một string

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.