2010-06-09 27 views
2

簡單的問題在這裏。我有一個C#程序,它需要將一些文件存儲到硬盤上,但我不需要它們對最終用戶有用,只有程序可以讀/寫的地方。C#目錄「玩」

是否有一個我可以通過編程引用的目錄作爲我的「文件空間操場」 - 也就是說,我可以自由地讀寫數據?

編輯:另外,如果我使用臨時目錄,文件保證有多長時間?當我的程序仍在運行時,我不希望它們消失!

+0

您是否有其他特殊要求?這些臨時文件是?你想阻止訪問文件嗎? – 2010-06-09 15:51:12

+0

他們是暫時的。然而,它們可能會在程序運行時被打開,關閉並重新打開,所以我需要它們在程序啓動時不會消失。 我不需要防止任何其他訪問。 – 2010-06-09 15:57:51

+0

關於你的編輯,他們會在那裏,直到你清理它們。你的程序應該自動執行此操作,但許多程序不會。這就是爲什麼Windows允許您運行工具來清理臨時文件夾,但它仍然是啓動它的操作。 – GalacticCowboy 2010-06-09 16:07:46

回答

6

您可以使用系統臨時目錄,你可以得到:

string tmpDir = System.IO.Path.GetTempPath(); 

如果你願意,你可以在那裏創建子文件夾。臨時文件夾非常適合您不關心的文件。如果您想保留這些文件,您可以像Tim C和Graham Miller所建議的那樣使用ApplicationData文件夾。

+0

只是好奇...有沒有理由爲什麼Windows會決定刪除臨時數據,而使用它的應用程序正在運行,對不對? – RavB 2010-06-09 16:04:47

+0

Windows根本不會自動清理臨時目錄。作爲用戶,您必須手動完成。基本上,這是將應用程序的數據保存在用戶知道的地方的一種很好的方式,它只是暫時的。但是,有些實用程序會爲您清理臨時目錄,並且如果在應用程序執行過程中將其設置爲關閉,它將在您的應用程序使用它時刪除數據。儘管如此,這是相對罕見的 – 2010-06-09 16:08:14

+1

臨時目錄中的文件只能手動(由用戶)或硬盤清理過程(通常手動或計劃運行)刪除。與往常一樣,你應該用一些Try..Catch塊來包裝你的代碼來處理諸如File Not Found或沒有足夠磁盤空間的事情。如果你不關心文件名是什麼,你可以使用Path.GetTempFileName方法來生成一個文件名。 – TLiebe 2010-06-09 16:09:39

1

這聽起來像你正在尋找isolated storage

隔離存儲是數據存儲 機制,通過定義標準化的方式代碼保存的數據相關聯的 提供隔離和安全 。 標準化也提供了其他 的好處。管理員可以使用 使用專門設計來操縱 孤立存儲的工具來配置文件 存儲空間,設置安全策略, 並刪除未使用的數據。使用獨立的 存儲空間,您的代碼不再需要 唯一路徑來指定文件系統中的安全位置 ,並且數據是 受其他應用程序保護,該應用程序只能隔離存儲訪問。 指示 的應用程序的存儲區域爲 的硬編碼信息是不必要的。

0

C:\TEMP

認真,不,沒有內置的沙箱操場。你必須選擇/創建一個適合你需求的目錄。

0

這通常是AppData文件夾。它位於用戶特定的目錄樹中,但不在普通用戶的位置。

0

通常,應用程序特定的數據存儲在由枚舉指定的位置。您可以使用ApplicationData每使用應用程序特定的數據,或者LocalApplicationData爲每臺計算機的變種:

var playground = Environment.GetFolderPath(
    Environment.SpecialFolder.ApplicationData)); 
1

使用系統臨時目錄:

System.IO.Path.Combine(System.IO.Path.GetTempPath(), "your app name")

的臨時目錄中自動清理由系統(通常通過硬盤清理),所以它通常是存儲隨機文件的最佳選擇,這些隨機文件僅在應用程序運行時需要並且不需要停留。

alt text http://i49.tinypic.com/10hix5x.png

如果您需要一個存儲用戶數據文件的一個更持久的解決方案,使用AppData文件夾被其他人的建議。

+0

您也可以通過在運行對話框中輸入「%Temp%\ your app name」輕鬆地打開它。 – devios1 2010-06-09 15:57:13

+0

臨時文件夾在您的應用程序運行時不會被刪除 - 我認爲硬盤清理只會刪除一週或更長時間未訪問的臨時文件。 – devios1 2010-06-09 15:58:44

+1

實際上,它們不是「自動」清理的 - 用戶必須手動刪除它們或有意運行硬盤清理。 HDC可以「自動」清理它們,但首先仍然需要用戶操作。 – GalacticCowboy 2010-06-09 16:09:52

8

我會使用應用程序數據目錄。

Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 

它是在應用程序特定數據窗口中的首選位置,所以一般用戶隱藏,除非他們願意去尋找它:您可以使用類似得到它。

+0

這個問題不是暫時的,不會自動清理。 – devios1 2010-06-09 15:48:18

+1

但是,應用程序應該在該文件夾內創建一個*子文件夾*,而不是用文件污染基文件夾。通常的做法是使用ApplicationData \ Manufacturer \ Product。 – 2010-06-09 15:50:37

+0

@chaiguy:這是真的,但在原始問題中,Adam沒有要求自動清理的臨時目錄。他要求提供「程序可以讀取/寫入」,「不需要它們對最終用戶有用的任何地方」以及「可以以編程方式引用」的位置。 – 2010-06-09 15:50:40

1

我想你想要的應用程序數據目錄:

var appplicationDirectory = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData); 
0

基類庫爲您提供一個類來管理一組臨時文件。大家都隱藏在System.CodeDom命名空間,但仍然可以在其他情況下也是有用的:

TempFileCollection

下面的示例顯示了TempFileCollection類如何使用。

using System; 
using System.CodeDom.Compiler; 
using System.IO; 

class Program 
{ 
    static void Main(string[] args) 
    { 
     TempFileCollection tfc = new TempFileCollection(Path.GetTempPath()); 

     // add a temporary text file 
     string filename1 = tfc.AddExtension("txt"); 

     // add another file with a fully specified name 
     // this file will not automatically be deleted 
     string filename2 = Path.Combine(tfc.TempDir, "mycustomfile.txt"); 
     tfc.AddFile(filename2, true); 
     Console.WriteLine(tfc.Count); 
     // Create and use the test files. 
     File.WriteAllText(filename1, "Hello World."); 
     File.WriteAllText(filename2, "Hello again."); 
     tfc.Delete(); 
    } 
}