2009-10-13 36 views
5

Tôi có một trình soạn thảo văn bản mà tôi đã tạo, đã hoạt động hoàn hảo trong tháng vừa qua mà không gặp bất kỳ sự cố nào. Nhưng hôm nay, và tất cả các ngày hôm qua, mỗi lần tôi mở một tệp txt từ trình thám hiểm (nhấp đúp vào nó) thay vì mở trong trình soạn thảo của tôi, một thông báo xuất hiện nói:Ứng dụng của tôi gặp sự cố với FileNotFoundException và tôi không hiểu lý do tại sao

Trình soạn thảo văn bản đã gặp sự cố và cần gần. Chúng tôi xin lỗi vì sự bất tiện này. [Gửi báo cáo lỗi] hoặc [Không gửi].

Khi tôi bấm vào "gì báo cáo lỗi này chứa", nó cho thấy như sau:

EventType : clr20r3  P1 : texteditor.exe  P2 : 1.0.0.0  P3 : 4ad32c52  
P4 : mscorlib  P5 : 2.0.0.0  P6 : 492b834a  P7 : 343f  P8 : d8  
P9 : system.io.filenotfoundexception 

Vì vậy mà về cơ bản nói với tôi rằng nó đang tìm kiếm một tập tin mà không tồn tại. Nhưng đây là vấn đề của tôi:
File Tôi cố gắng để mở không tồn tại bởi vì tôi chỉ nhấp đúp vào nó

Dưới đây là đoạn code mà mở một tập tin đã được nhấp đúp vào từ cửa sổ explorer:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Windows.Forms; 

namespace TextEditor 
{ 
    static class Program 
    { 
     /// <summary> 
     /// The main entry point for the application. 
     /// </summary> 
     [STAThread] 
     static void Main(string[] args) 
     { 
      Application.EnableVisualStyles(); 
      Application.SetCompatibleTextRenderingDefault(false); 

      if (args.Length >= 1) 
      { 
       Form1 f = new Form1(); 
       f.txt.Text = System.IO.File.ReadAllText(args[0]); 
       f.txt.Tag = args[0]; 

       Application.Run(f); 
      } 
      else Application.Run(new Form1()); 
     } 
    } 
} 

Trả lời

58

Đường dẫn mà bạn đang nhấp đúp vào có thể chứa một hoặc nhiều khoảng trắng, khiến đường dẫn được gửi dưới dạng nhiều đối số dòng lệnh.

Bạn cần thay đổi liên kết .txt để gửi đường dẫn trong dấu ngoặc kép và/hoặc thay đổi ứng dụng của bạn để đọc tất cả đối số dòng lệnh và kết hợp chúng với dấu cách.

Explorer đang gửi một lệnh chẳng hạn như

YourApp.exe C:\Documents and Settings\YourName\My Documents\YourFile.txt 

Kể từ khi không có bất kỳ dấu ngoặc kép quanh chuỗi, nó hiểu là 4 thông số khác nhau bằng dấu cách.

Bạn có thể thay đổi liên kết cho .txt tệp thành YourApp.exe "%1" (với %1 trong dấu ngoặc kép) để buộc toàn bộ chuỗi được coi là một đối số.

Hoặc, bạn có thể thay thế args[0] bằng String.Join(" ", args) để đặt các đối số lại với nhau.

+1

Đề xuất cuối cùng phân tích các tên tệp có nhiều hơn một không gian liên tiếp, trong số những thứ khác. Chỉ cần trích dẫn tên đường là cách để đi. –

3

Rõ ràng là bạn có một lỗi: truy cập sai tệp.

Nếu bạn không thể gỡ lỗi trên máy đã cho, hãy tải xuống và sử dụng FileMon từ sysinernals và xem trình chỉnh sửa của bạn đang truy cập tệp nào.

8

Mã bạn đã đăng không xử lý bất kỳ ngoại lệ nào (như FileNotFoundException) mà chương trình của bạn tạo. Đó là lý do tại sao bạn nhận được hộp "AppCrash" xấu xí, vô ích. Là bước gỡ lỗi, hãy thử gói mã có vấn đề trong khối try/catch, như vậy:

try 
{ 
    if (args.Length >= 1) 
{ 
    // your code 
} 
catch (Exception e) 
{ 
    Console.WriteLine(e); 
} 

Điều này sẽ cho bạn biết, ít nhất, phương pháp không thành công. Xây dựng trong chế độ gỡ lỗi và chạy từ dòng lệnh với tệp .pdb của bạn trong cùng một thư mục và bạn sẽ nhận được số dòng bị lỗi.

Ngoài ra, hãy thử in đường dẫn bạn đang cố gắng mở (sử dụng MessageBox hoặc Console.WriteLine() từ dòng lệnh). Bạn có thể thấy một cái gì đó kỳ lạ. Có vẻ như bạn đã liên kết loại tệp với ứng dụng của mình và đang chạy ứng dụng bằng cách nhấp đúp vào tệp. Vỏ có thể đang thay đổi đường dẫn đến tệp đó theo cách bạn không mong đợi; in đường dẫn sẽ cho bạn biết điều đó.

Nếu bạn vẫn bị kẹt, hãy đăng theo dõi ngăn xếp kết quả. Nó cũng sẽ hữu ích để đăng hoàn thành, mã ứng dụng khép kín thể hiện vấn đề. Mẫu mã bạn đăng đã đóng, nhưng có sự phụ thuộc vào Form1. 10 đô la Mỹ cho biết rằng trong quá trình thực hiện việc này, bạn sẽ có một khoảnh khắc "Eureka" và xem vấn đề.

Ngoài ra, nếu bạn có quyền truy cập vào trình gỡ lỗi (trong Visual Studio), bạn có thể duyệt qua mã cho đến khi bạn thấy ngoại lệ được ném.

+1

Đồng ý. Ngoài ra, nếu bạn xây dựng trong một khối catch-tất cả và chỉ có nó đăng nhập vào bản ghi sự kiện, bạn có thể để nó trong mã sản xuất, và nó sẽ cung cấp thông tin phản hồi hữu ích trong trường hợp bạn có thất bại khác trong lĩnh vực này. –

+0

cảm ơn Micahel, tôi đã cố gắng theo cách của bạn và khi tôi cố gắng mở tệp từ trình thám hiểm, ngoại lệ được hiển thị trong hộp thư nói "Không thể tìm thấy tệp 'C: \ Documents'. Mặc dù tệp thực sự ở bên trong:" C: \ Documents and Settings \ User \ My Documents \ file.txt "..so, tôi nghĩ nó có liên quan đến filepath có nhiều hơn một khoảng trống trong nó, như Slaks được đề cập dưới đây ?. –

+0

Đúng vậy, âm thanh Giả sử <= WindowsXP, đi tới Tùy chọn thư mục, Loại tệp, tìm liên kết tệp của bạn và nhấp vào "Nâng cao", chỉnh sửa liên kết và trong hộp văn bản trong "Ứng dụng được sử dụng để thực hiện hành động ", đảm bảo rằng% 1 có dấu ngoặc kép xung quanh nó. Bạn sẽ kết thúc bằng một cái gì đó như: '" c: \ program files \ myapp.exe ""% 1 "' –

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