2011-07-20 25 views
16

Tôi đã sử dụng ApplicationDeployment.CurrentDeployment.DataDirectory để lưu trữ nội dung do khách hàng tải xuống khi chạy, dự kiến ​​sẽ có mỗi khi ứng dụng khởi chạy, tuy nhiên bây giờ tôi thấy các thay đổi này dường như ngẫu nhiên nếu ứng dụng được cập nhật.Tôi có thể lưu trữ các tệp dữ liệu một cách an toàn để triển khai ClickOnce ở đâu?

Phương pháp đáng tin cậy nhất để lưu trữ dữ liệu người dùng cho ứng dụng trong triển khai lần nhấp là gì?

Hiện nay tôi đã sử dụng các phương pháp sau đây

private const string LocalPath = "data"; 

public string GetStoragePath() { 
    string dir; 
    if (ApplicationDeployment.IsNetworkDeployed) { 
     ApplicationDeployment ad = ApplicationDeployment.CurrentDeployment; 
     dir = Path.Combine(ad.DataDirectory, LocalPath); 
    } else { 
     dir = LocalPath; 
    } 
    return CreateDirectory(dir); 
} 

tôi ban đầu theo bài viết Accessing Local and Remote Data in ClickOnce Applications dưới tiêu đề ClickOnce Data Directory trong đó nêu này được khuyến khích con đường.

LƯU Ý: CreateDirectory(string) chỉ cần tạo thư mục nếu thư mục chưa tồn tại. Tôi đã tìm thấy nguyên nhân gốc rễ của vấn đề là tôi đang tạo nhiều tệp và tệp chỉ mục, tệp chỉ mục này chứa đường dẫn tuyệt đối, nhấp một lần di chuyển nội dung (hoặc bản sao) lên bản nâng cấp, vì vậy đường dẫn tuyệt đối không còn tồn tại nữa. Tôi sẽ điều tra bộ nhớ bị cô lập vì Damokles đề xuất xem liệu điều này có cùng tác động đến các lần triển khai lần nhấp hay không.

+1

Nếu bạn đi tuyến đường lưu trữ bị cô lập, hãy nhớ xem các câu hỏi ... http: // stackoverflow.com/questions/202013 – codeConcussion

+0

Cảm ơn whatknott, tôi sẽ ghi nhớ điều này. –

Trả lời

20

lựa chọn khác là để tạo ra một thư mục cho ứng dụng của bạn trong thư mục AppData của người dùng và lưu trữ nó ở đó. Bạn có thể tìm đường dẫn đến điều đó với điều này:

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData) 

Bạn sẽ tìm thấy rất nhiều ứng dụng sử dụng (và địa phương tương đương). Nó cũng không di chuyển giữa các phiên bản ClickOnce.

+0

Tôi đã chọn phương pháp này vì đó là thay đổi ít xâm nhập. Sử dụng lưu trữ chuyển vùng bị cô lập có thể là cách tiếp cận tốt nhất, tuy nhiên điều đó sẽ đòi hỏi rất nhiều thay đổi trên tất cả các ứng dụng của tôi, nơi đây là một thay đổi dòng đơn. Tôi cảm ơn bạn rất nhiều vì Tridus này. –

+0

Đây là câu hỏi dành cho các bạn. Điều gì xảy ra với những tệp này khi bạn gỡ cài đặt ứng dụng ClickOnce? –

+0

@AlexSorokoletov Không có gì. Chúng không phải là một phần của ứng dụng nên chúng bám sát xung quanh. – Tridus

5

Kiểm tra IsolatedStorage điều này sẽ hữu ích. Nó thậm chí hoạt động trong môi trường tin cậy một phần.

Để giữ cho bạn dữ liệu bạn cần phải sử dụng mã application scoped IsolatedStorage

using System.IO; 
using System.IO.IsolatedStorage; 
... 

IsolatedStorageFile appScope = IsolatedStorageFile.GetUserStoreForApplication();  
using(IsolatedStorageFileStream fs = new IsolatedStorageFileStream("data.dat", FileMode.OpenOrCreate, appScope)) 
{ 
... 

lấy từ this post

+0

Cảm ơn Damokles, tôi sẽ xem xét nó. Tôi thấy rằng ClickOnce thực sự sao chép dữ liệu của tôi, nhưng tôi đã lưu trữ đường dẫn tuyệt đối và ofcourse các tập tin cũ không còn tồn tại, sẽ bị cô lập lưu trữ có cùng một vấn đề hoặc sẽ bấm một lần để lại nó một mình cho tôi? –

+0

@Brett: yes IsolatedStorage sẽ khắc phục sự cố đó nếu bạn sử dụng đúng cách. –

+0

Demokles, thankyou rất nhiều cho câu trả lời này, tôi nghĩ rằng đây sẽ là một cách tiếp cận tuyệt vời và sẽ giữ điều này trong tâm trí cho các ứng dụng mới, tuy nhiên tôi đã chọn sử dụng phương pháp 'ApplicationData' vì nó là một thay đổi ít xâm nhập. Tôi cảm ơn bạn rất nhiều vì câu trả lời của bạn. –

4

Nó phụ thuộc vào dữ liệu bạn đang tiết kiệm.

Bạn hiện đang lưu vào Thư mục dữ liệu. Điều bạn cần biết là mỗi phiên bản của ứng dụng đều có Thư mục Dữ liệu riêng. Khi bạn cập nhật ClickOnce sao chép tất cả dữ liệu từ phiên bản trước sang phiên bản mới khi ứng dụng được khởi động. Điều này cho bạn một cái móc để di chuyển bất kỳ dữ liệu nào từ một phiên bản sang phiên bản tiếp theo. Điều này là tốt cho cơ sở dữ liệu bộ nhớ như Sql Lite hoặc SQL CE.

Một điều mà tôi cam kết là khi bạn có một lượng lớn dữ liệu (4 gig) nếu bạn lưu trữ nó trong Thư mục dữ liệu, dữ liệu này sẽ được sao chép từ phiên bản cũ sang phiên bản mới. Điều này sẽ làm chậm thời gian khởi động sau khi nâng cấp. Nếu bạn có một lượng lớn dữ liệu hoặc bạn không muốn lo lắng về việc di chuyển dữ liệu, bạn có thể lưu trữ dữ liệu trong thư mục người dùng cục bộ cung cấp cho bạn toàn bộ tin cậy hoặc bạn có thể sử dụng bộ nhớ riêng nếu bạn có một phần tin cậy.

Isolated Storage

Local User Application Data

+0

Cảm ơn bạn đã sử dụng Bronumski này, điều này sẽ lặp lại một số vấn đề mà tôi đang đối mặt, kích thước dữ liệu của tôi tương đối nhỏ không lớn hơn khoảng 50MB. –

+3

Ngoài ra, nó không mang dữ liệu về phía trước nếu bạn đã tạo các tệp mới. Nó chỉ mang dữ liệu được triển khai tới phiên bản tiếp theo. – RobinDotNet

+0

@RobinDotNet Điểm tốt – Bronumski

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