![](/img/trans.png)
[英]getting current file length / FileInfo.Length caching and stale information
[英]FileInfo Error for getting length size
private long yy=0;
private void CopyAll(DirectoryInfo source,DirectoryInfo target )
{
if (Directory.Exists(target.FullName) == false)
{
try
{
Directory.CreateDirectory(target.FullName);
}
catch (Exception ee)
{
MessageBox.Show(ee.Message);
}
}
foreach (FileInfo fi in source.GetFiles())
{
yy += fi.Length;
backgroundWorker1.ReportProgress((int)yy / 1024);
}
foreach (DirectoryInfo diSourceSubDir in source.GetDirectories())
{
DirectoryInfo nextTargetSubDir =
target.CreateSubdirectory(diSourceSubDir.Name);
CopyAll(diSourceSubDir, nextTargetSubDir);
}
我執行此操作時得到的結果是負數和錯誤的值,是否已經回答過此問題,有人知道做錯了什么嗎?
根據其他人的要求。 什么是“ yy”? 是整數嗎? 長嗎? 一個字節? 單身? 一雙? 一個字符串? 沒人知道。 yy被神秘包圍。 我認為yy是一個“長”文件,因為這可能是最安全的方式(盡管仍然容易出現問題)。 我也將忽略您的變量名不匹配,以幫助您解決問題。
我們出發前的輕便閱讀材料: https : //en.wikipedia.org/wiki/Integer_overflow
yy我想是您的源目錄文件的總文件大小。 當yy達到[datatype] .MaxValue指定的最大值時,有符號值越過它,它將抵消[datatype] .MinValue的剩余值。 在每次迭代時中斷,在其中添加yy並將手表添加到“ yy”。 您將看到其值緩慢地(或快速地,取決於目錄中文件的大小)達到[數據類型] .MaxValue。 當達到並持續添加時,將返回MinValue。
對於一些交互式學習,請嘗試以下代碼:
long val = long.MaxValue;
val += 1;
檢查val,您會看到它是-9223372036854775808。 (請參閱以前的燈光學習材料)
您的問題必須是“我在這里能取得什么成就”。 您是否必須了解所有文件的總大小,還是可以以不同的方式實現? 實現超大尺寸值的常見方法是在其自己的數據存儲區中保留對每個單元的引用。 按單位,我的意思是單位,數十,數百,數千等,等等,然后添加您的single.Length。 您將必須自己編寫。
您可以將浮點數用於更大的數字,但這完全取決於您需要的讀數精度。 (隨着數字的增加,浮點數會失去精度)
編輯:再次查看代碼后要考慮的另一點。 您在報表進度中將yy轉換為int。 如果yy長並且當yy大於int.MaxValue時將其強制轉換為int,則將看到相同的問題。 為什么將yy轉換為int? 為什么不直接在yy上除以1024然后將其強制轉換為int(仍然假設yy很長)
(int)(yy / 1024)
編輯2:按照詳細的代碼,您將遍歷幾乎絕對已經在yy值上達到MaxValue的文件夾。
編輯3:為什么在編寫看起來像“復制”方法來復制整個目錄結構的文件時,為什么還要關心所有文件的總大小? (請注意,您在目標目錄中建立目錄,但不要復制任何文件,因此它似乎是目錄結構的副本,而不是數據。)如果要執行某種“目標中是否有足夠的空間來執行此復制”您應該在目標位置執行任何操作之前先計算空間。
祝好運!
Directory.GetFiles()
將為您提供字符串列表。 您不能將其直接轉換為FileInfo
,這就是這里的問題。FileInfo.Length
將返回文件大小(以bytes
,因此,如果文件大小較大,則整數范圍不足以容納該值。 所以檢查yy
的數據類型
因此,我建議您執行以下操作:
foreach (string F in Directory.GetFiles("D:\YourDirectory"))
{
FileInfo tempFileInfo = new FileInfo(F);
yy += tempFileInfo.Length;
backgroundWorker1.ReportProgress((int)yy / 1024);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.