2009-09-23 47 views
10

Tôi cần tạo một số bitmap và lưu chúng vào hệ thống tệp. Vì lý do nào đó, hệ thống MScharting muốn các tệp nền của nó cung cấp dưới dạng đường dẫn ở dạng chuỗi.Tệp tạm thời trong .Net

Tôi đang tự động tạo hình nền, mặc dù chỉ một vài lần.

Cách tốt nhất để tạo những tệp này và sau đó xóa chúng là gì?

+0

Bạn có chắc chắn các phương pháp bạn đang gọi không có bất kỳ quá tải nào có luồng thay vì đường dẫn không? – MusiGenesis

+0

Tôi biết có một loạt các thư viện MS chỉ chấp nhận đường dẫn (DirectX là một trong những ý nghĩ đến). Nó thường được coi là thiết kế API kém, nhưng đôi khi bạn không có nhiều sự lựa chọn, thiếu thiết lập một đĩa RAM. –

Trả lời

9

Đặt cược tốt nhất của bạn là có một TemporaryFileManager triển khai IDisposable; bạn yêu cầu nó cho các tệp tạm thời, nó tự động tạo và dính trong thư mục tạm thời ở đâu đó, tất cả chúng sẽ bị xóa khi TemporaryFileManager được xử lý, hoặc bởi bạn hoặc trình hoàn thiện (nếu bạn đã triển khai đúng mẫu dùng một lần)

14

Đây là cách bạn có thể nhận được đường dẫn đầy đủ và tên tập tin của một tập tin tạm thời:

string tempFile = System.IO.Path.GetTempFileName(); 

Tạo tập tin sử dụng đường dẫn filename & này và khi bạn đã hoàn tất xóa nó.

+0

Vì lý do không rõ phương pháp này đôi khi không đáng tin cậy và có thể ném System.IO.IOException: Tệp có sẵn –

1

Trong các dự án của tôi, tôi có một lớp trợ giúp được gọi là TempFile. Nó có một số phương thức tĩnh mà tôi sử dụng để viết một luồng (hoặc một mảng byte nếu cần) vào một tệp tạm thời. Dưới đây là một ví dụ đơn giản của một phương pháp như:

public static string Write(Stream stream) 
{ 
    string FileName = Path.GetTempFileName(); 

    // Write the contents of stream to a file with FileName 

    return FileName; 
} 

Sau đó, tôi có một phương pháp mà chấp nhận một đường dẫn tập tin để xóa sau đó là thành viên của lớp 'phân tích' của tôi, mặc dù bạn có thể đặt nó trong tĩnh của riêng mình lớp helper:

public string ForDeletion(string path) 
{ 
    ListOfPaths.Add(path); 

    return path; 
} 

Cuối cùng, tôi thực hiện như sau:

SomeApiFunction(ForDeletion(TempFile.Write(myStream))); 

Đây là cách tốt nhất mà tôi đã đưa ra cho phá vỡ thiếu của một API về khả năng xử lý dòng.

0

tôi sử dụng giải pháp nà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