2009-03-18 32 views
13

Tôi cần làm việc với một số tệp tạm thời trong ứng dụng Windows Forms .NET 3.5 của tôi. Các tệp đó được mở trong một ứng dụng bên ngoài, tất nhiên có thể chạy trong một thời gian dài hơn chương trình của riêng tôi.Xóa các Tệp Tạm thời sau khi sử dụng

Có cách nào tốt nhất để đảm bảo các tệp tạm thời này được dọn dẹp bất kỳ lúc nào để tránh làm đầy đĩa cứng của người dùng bằng các tệp "rác" không cần thiết nữa không? Hoặc thậm chí Windows loại xử lý này tự động?

Ví dụ hay là bất kỳ ứng dụng thư nào: Khi bạn mở tệp đính kèm trong bất kỳ ứng dụng nào, nó thường được ghi vào tệp tạm thời được mở. Có cách nào để tìm ra cách các tệp đó quản lý việc dọn dẹp không?

Sử dụng Google đã chỉ cho tôi nhiều công cụ dọn dẹp và điều chỉnh để làm sạch thư mục tạm thời bằng tay, nhưng tôi không muốn ép buộc người dùng làm như vậy. :-)

Mọi trợ giúp đều được đánh giá cao.

Matthias

Trả lời

5

Nếu bạn cố gắng để tất định rõ ràng các nội dung của một tập tin thư mục Temporary loại, bạn có nguy cơ loại bỏ các file đó đang được sử dụng bởi các quá trình khác. Hệ điều hành Windows cung cấp các công cụ để cho phép người dùng loại bỏ các tệp đó khi không gian đĩa có sẵn của ổ đĩa đạt đến một ngưỡng nhất định.

Bây giờ, nếu bạn có thể xác định rằng sau khi bạn sử dụng một tệp tạm thời cụ thể mà nó sẽ không còn cần thiết nữa, thì không có phần phụ nào để xóa tệp cụ thể đó.

+0

Yeah, atm Tôi đang bắt quá trình 'Thoát-sự kiện để xóa các tệp không cần thiết nữa ... vì vậy, thực tiễn tốt để "khuyến khích" người dùng sử dụng công cụ Dọn Đĩa Windows? :) –

27

Trong .NET, bạn có thể sử dụng lớp TempFileCollection để quản lý tập hợp các tệp tạm thời cần được dọn dẹp bởi ứng dụng của bạn (Lưu ý rằng nó bị ẩn trong không gian tên CodeDom). Rõ ràng bạn không thể xóa bất kỳ tệp nào không thuộc sở hữu của chính bạn, vì các tệp có thể vẫn được mở bởi một ứng dụng khác (và xóa chúng có thể gây ra các sự cố nghiêm trọng).

+0

Lớp TempFileCollection? Nóng bức! –

+8

Thật vậy ;-) Không biết tại sao lớp học này bị ẩn đi. Nếu không phải ngẫu nhiên, bạn sẽ không tìm thấy nó ... –

+0

Chà, không còn giải pháp nào được cán tay, có vẻ như Microsoft đã thực hiện mọi thứ 2 năm sau khi chúng tôi cần;) – invert

1

Tôi tin rằng chúng sẽ bị xóa khi người dùng đăng xuất.

Quay lại những ngày mọi người tắt máy tính của họ mỗi ngày, đó có thể là giải pháp hoàn hảo.

Giờ đây, mọi người có thể mất nhiều tháng mà không đăng xuất, vì vậy, có thể không nên dựa vào điều đó.

Ngoài ra, nếu tắt máy của chúng mà không tắt thì tệp sẽ không bị xóa.

Bạn có thể sử dụng trình theo dõi tệp mà bạn xem và đợi một khoảng thời gian không hoạt động (10 phút, 1 giờ, 1 ngày hoặc bất kỳ thứ gì) và sau đó xóa tệp.

Điều đó sẽ không hoạt động đối với mọi thứ. Một số chương trình có thể có tệp "mở" nhưng có thể không có tệp cơ bản bị khóa. Nếu điều đó xảy ra, thì bạn sẽ không có cách nào để biết khi nào an toàn để xóa tệp.

Tuy nhiên, tôi nghĩ bạn có thể chỉ bỏ qua vấn đề. Hầu hết mọi người có thể có một dư thừa không gian ổ đĩa cứng anyways, vì vậy họ có lẽ không có khả năng chạy vào nó. Nếu có, tôi nghĩ Windows sẽ xuất hiện một hộp thoại không gian đĩa thấp cho phép tùy chọn xóa thư mục tạm thời của họ, điều này sẽ giải quyết được vấn đề.

Cập nhật:

Tôi nghĩ rằng Windows Update sẽ khởi động lại máy tính của người dùng về mỗi tháng một lần, vì vậy các tập tin tạm thời nên được xóa khi điều đó xảy ra.

Không có gì đảm bảo rằng sẽ không có vấn đề gì, nhưng trong thực tế, tôi nghĩ rằng điều đó khá hiếm.

Cập nhật 2:

Xuất phát từ một nhận xét, tôi đã đi và thực sự thử nghiệm này, và có vẻ như các cửa sổ sẽ không xóa các tập tin tạm thời khi người dùng đăng xuất. Tuy nhiên, tôi vẫn nói rằng trong trường hợp của OP, đây không phải là một vấn đề thực sự. Khi nó trở thành một vấn đề (vì không gian đĩa thấp) Windows sẽ nhắc người dùng xóa các tệp tạm thời.

+0

Bạn muốn dựa vào bản cập nhật Windows? Và rằng bản cập nhật sẽ yêu cầu khởi động lại? Và người dùng đã không tắt tự động cập nhật? – Martin

+0

Tôi nói rằng nó không phải là một vấn đề lớn nếu bạn để lại các công cụ trong thư mục tạm thời. Có một số cách cửa sổ sẽ tự động xóa các tệp. Ngay cả khi nó không chỉ là một vấn đề nếu không gian đĩa thấp. Khi điều đó xảy ra, người dùng sẽ thấy hộp thoại cho biết "đây là cách khắc phục sự cố này". –

+0

Trên cấu hình mặc định, Windows sẽ không dọn sạch bất kỳ tệp nào từ thư mục tạm thời của bạn (trừ khi bạn chạy Cleanmgr.exe khi bạn nhận được mẹo bóng mà ổ đĩa của bạn không đủ dung lượng đĩa trống, nhưng tôi sẽ không gọi tự động) . –

6

Trách nhiệm dọn dẹp các tệp tạm thời phải có trên ứng dụng đã tạo chúng. Nó rất dễ. Tôi sử dụng một lớp trông giống như sau:

public class TempFile : IDisposable 
{ 
    public TempFile() 
    { this.path = System.IO.Path.GetTempFileName(); } 

    public void Dispose() 
    { File.Delete(path); } 

    private string path; 
    public string Path { get { return path; } } 
} 

Nếu bạn được yêu cầu dọn sạch các tệp tạm thời của ứng dụng khác, cần có phương tiện giao tiếp với bạn. Ở mức tối thiểu nó sẽ có thể cung cấp một semaphore. Tuy nhiên sự phức tạp của việc làm này là lớn hơn sự phức tạp của việc chỉ có ứng dụng gốc sẽ chăm sóc các tệp riêng của nó.

2

Chúng tôi gặp sự cố tệp tương tự - ứng dụng (winforms) có thể tìm nạp tài liệu từ kho lưu trữ trung tâm để người dùng xem, nhưng người dùng có thể đóng ứng dụng của chúng tôi mà không ảnh hưởng đến tệp họ đang xem . Do vấn đề bảo mật, các tệp tài liệu cần phải được dọn dẹp để chúng không nằm quá lâu.

Giải pháp chúng tôi sử dụng là tạo thư mục có tên bắt nguồn từ ngày trong khu vực lưu trữ riêng biệt của người dùng và sử dụng làm bộ nhớ cache hiện tại. Tại ứng dụng close-down và start-up, chúng ta kiểm tra các thư mục cache ngày trước đó và xóa chúng (và nội dung).

1

Khi sử dụng tệp tạm thời trong ASP.NET, hãy sử dụng sự kiện PAGE_DISPOSED để xóa bất kỳ tệp tạm thời nào bạn đã tạo trong trang. Nếu không, bạn có thể kết thúc với tranh chấp với các thành phần mà không cho phép cho đến khi XỬ LÝ.

0
  • bạn có thể tạo một tập tin tạm thời, trong đó bạn có thể giữ bằng văn bản cho tên tập tin được tạo ra trong quá trình này, vào cuối xử lý có thể bạn có thể (điều kiện tiên quyết - Thực hiện IDisposable và) xóa trong phương pháp Disponse sau hoạt động được hoàn thành.

  • Cách khác là viết quy trình độc lập thực hiện dọn dẹp mỗi khoảng thời gian.

  • Làm theo ngày ở cuối tệp và xóa vào cuối ngày với ngày đó và quá trình sẽ tạo tệp mới có ngày mới ở cuối tệp.

  • một đề xuất tốt được đưa ra bởi lớp divo tempfilecollection.

hy vọng điều đó sẽ hữu ích.

1

tôi sử dụng giải pháp này (khá đáng tin cậy):

using System.IO; 
using System.Reflection; 

namespace Konard.Helpers 
{ 
    public static partial class TemporaryFiles 
    { 
     private const string UserFilesListFilenamePrefix = ".used-temporary-files.txt"; 
     static private readonly object UsedFilesListLock = new object(); 

     private static string GetUsedFilesListFilename() 
     { 
      return Assembly.GetEntryAssembly().Location + UserFilesListFilenamePrefix; 
     } 

     private static void AddToUsedFilesList(string filename) 
     { 
      lock (UsedFilesListLock) 
      { 
       using (var writer = File.AppendText(GetUsedFilesListFilename())) 
        writer.WriteLine(filename); 
      } 
     } 

     public static string UseNew() 
     { 
      var filename = Path.GetTempFileName(); 
      AddToUsedFilesList(filename); 
      return filename; 
     } 

     public static void DeleteAllPreviouslyUsed() 
     { 
      lock (UsedFilesListLock) 
      { 
       var usedFilesListFilename = GetUsedFilesListFilename(); 

       if (!File.Exists(usedFilesListFilename)) 
        return; 

       using (var listFile = File.Open(usedFilesListFilename, FileMode.Open)) 
       { 
        using (var reader = new StreamReader(listFile)) 
        { 
         string tempFileToDelete; 
         while ((tempFileToDelete = reader.ReadLine()) != null) 
         { 
          if (File.Exists(tempFileToDelete)) 
           File.Delete(tempFileToDelete); 
         } 
        } 
       } 

       // Clean up 
       using (File.Open(usedFilesListFilename, FileMode.Truncate)) { } 
      } 
     } 
    } 
} 

Mỗi khi bạn cần sử dụng tập tin tạm thời:

var tempFile = TemporaryFiles.UseNew(); 

Để chắc chắn tất cả các file tạm thời được xóa sau khi sử dụng đóng hoặc tai nạn đưa

TemporaryFiles.DeleteAllPreviouslyUsed(); 

khi bắt đầu ứng dụng.

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