2010-09-07 32 views
8

Tôi có tệp thực thi di động để lưu dữ liệu vào tệp trong cùng thư mục với tệp thực thi. Có cách nào để tôi có thể lưu dữ liệu vào bản thân thực thi khi tôi đóng ứng dụng không?Lưu dữ liệu trong tệp thực thi

Điều này có thể lạ, nhưng lấy dữ liệu với tôi và chỉ có một tệp cho exe và dữ liệu sẽ là tuyệt vời.

Muốn sử dụng điều này bằng C#, nhưng không phải là điều kiện tiên quyết.

Trả lời

3

Bạn không thể sửa đổi EXE của riêng mình để chứa dữ liệu được lưu trữ trong bất kỳ thứ gì tiếp cận một cách thanh lịch hoặc nhỏ gọn. Trước hết, hệ điều hành có được một khóa trên tập tin EXE trong khi ứng dụng chứa bên trong đang được chạy. Thứ hai, một EXE được biên dịch trước (thành MSIL ít nhất), và sửa đổi dữ liệu nguồn của tập tin thường yêu cầu biên dịch lại để thiết lập lại các con trỏ khác nhau để xử lý mã, hoặc một kiến ​​thức SERIOUS ở mức rất bí truyền về những gì bạn đang làm tập tin.

Phương pháp được chấp nhận chung là tệp cấu hình ứng dụng, tệp tài nguyên hoặc một số tệp tùy chỉnh bạn tạo/đọc/sửa đổi khi chạy, như bạn đang làm bây giờ. Hai tệp cho một ứng dụng không được gây ra mối quan tâm

+0

Vâng, tôi biết nó không phải là xấu theo cách của nó, nhưng với máy Mac bạn có thể sao chép thực thi, đó cũng là một thư mục, và tất cả các thông tin của bạn đi với bạn. Nó có vẻ chỉ là một chi tiết nhỏ nhưng muốn đặt nó vào công việc. –

1

Vậy hiện tại bạn đang sử dụng tệp app.config (và Settings.settings)? Tôi tin rằng đây là cách nhỏ gọn nhất để lưu dữ liệu gần .exe.

Tôi rất nghi ngờ bạn có thể thay đổi tệp kê khai của .exe hoặc bất kỳ phần nào khác của nó.

Chỉnh sửa: Rõ ràng, có thể có một số cách sau khi tất cả: http://www.codeproject.com/KB/msil/reflexil.aspx

2

Bạn có thể, bằng cách dành riêng không gian thông qua các phương tiện của việc sử dụng một nguồn tài nguyên chuỗi và pad nó ra. Bạn cần phải làm một chút công việc thám tử để tìm ra chính xác vị trí bù đắp cho tệp thực thi mà bạn muốn đưa dữ liệu vào, nhưng hãy cẩn thận, tệp sẽ là "khi sử dụng", vì vậy hãy tiến hành thận trọng với điều đó.

+0

Xem gửi bài này khác tôi đã thực hiện nhiều kiếp trước ... http://stackoverflow.com/questions/1780260/write-a-value-into -pe-file/1780360 # 1780360 – t0mm13b

1

Có một cách sử dụng nhiều luồng, nhưng chỉ hoạt động trong các hệ thống tệp NTFS. NTFS cho phép bạn xác định các luồng "có tên" thay thế trong một tệp. Nội dung thông thường nằm trong luồng chính = không được đặt tên. Nó có một cái gì đó để làm với các thông tin thêm bạn có thể nhìn thấy khi bạn nhấp chuột phải vào một tập tin và kiểm tra tài sản.
C# không may không hỗ trợ nhiều luồng, nhưng có những bài viết nguồn mở có thể giúp bạn.

Xem this link cho một wrapper tốt đẹp để đọc và ghi nhiều suối vào một tập tin duy nhất trong C#

1

dòng dữ liệu thay thế có thể làm việc. Bằng cách sử dụng cú pháp :: stream bạn có thể tạo một luồng dữ liệu bên trong exe của bạn và đọc/ghi dữ liệu. Chỉnh sửa: để tạo/truy cập luồng dữ liệu thay thế, bạn sẽ sử dụng một tên tệp khác. Một cái gì đó như: applicAtion.exe: cài đặt: $ data điều này sẽ truy cập luồng dữ liệu có tên là "cài đặt" trong application.exe. Để thực hiện điều này, bạn cần phải thêm: settings: $ data vào tên tệp khi đọc hoặc ghi vào tệp. Chức năng này được cung cấp bởi ntfs để nó làm việc trong C# và sẽ hoạt động khi ứng dụng đang chạy.

thông tin bổ sung có sẵn tại địa chỉ: http://msdn.microsoft.com/en-us/library/aa364404(VS.85).aspx

+0

xin lỗi vì có tính chất lừa đảo - nhưng bạn đã sử dụng cú pháp giống với C++ phải không? – t0mm13b

+0

Tôi đã thêm mô tả tốt hơn về luồng dữ liệu thay thế. Đây là một tính năng hệ thống tập tin và không phải là ngôn ngữ cụ thể. – Mike

0

Nếu bạn muốn lấy dữ liệu với bạn và chỉ có một tập tin cho exe và dữ liệu, .zip chúng thành một .exe self-extracting.

0

bạn có thể thêm dữ liệu để kết thúc của tập tin thực thi:

var executableName = Process.GetCurrentProcess().MainModule.FileName; 

    // rename executable file 
    var newExecutableName = fullPath.Replace(".exe", "_.exe"); 
    FileInfo fi = new FileInfo(executableName); 
    fi.MoveTo(newExecutableName); 

    // make copy of executable file to original name 
    File.Copy(newExecutableName, executableName); 

    // write data end of new file 
    var bytes = Encoding.ASCII.GetBytes("new data..."); 

    using (FileStream file = File.OpenWrite(executableName)) 
     { 
      file.Seek(0, SeekOrigin.End); 
      file.Write(bytes, 0, bytes.Length); 
     } 

    // we can delete old file when exited 
Các vấn đề liên quan