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");
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");
Câu trả lời:
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:
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.
Process.Start(@"c:\temp")
phải được sử dụng một cách thận trọng. Nếu c:\temp.com
tồ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.
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.exe
biế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\")
.
Để 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 đó.
C:\teste.exe
hoặc C:\teste.cmd
tồ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ự .
Verb = "select"
, nhưng than ôi bạn không thể. Bất kể, câu trả lời tuyệt vời!
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.)
.Verbs
tài sản trên ProcessStartInfo
( docs.microsoft.com/en-us/dotnet/api/ mẹo )
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 \
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");
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.
Path.DirectorySeparatorChar
. Mặt khác, nếu một thư mục có cùng tên nhưng .cmd
hoặc .exe
có 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.
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.
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");
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.
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.
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?
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");
}
}
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