如何粉碎文件 - C#


最近比較懶,寫啦挺多好東西,就是沒拿出來,今天發一個自己寫的ShredFile類

>文件粉碎的流程

  1. 填充文件
  2. 更改最后使用/創建時間
  3. 更改名稱
  4. 將大小改為 0 kb
  5. 刪除 

>具體代碼

View Code
using System;
using System.Collections.Generic;
using System.Text;
using System.IO;

namespace RocketStudio
{
class ShredFile
{
/// <summary>
/// 文件粉碎選項
/// </summary>
public enum ShredMode
{
/// <summary>
/// 隨機數
/// </summary>
RandData,
/// <summary>
/// 指定的Byte
/// </summary>
UserByte,
/// <summary>
/// 指定的字符串
/// </summary>
UserString
}
/// <summary>
/// 將指定的流粉碎使用隨機數
/// </summary>
/// <param name="fs">文件流</param>
/// <returns></returns>
public bool Shred(FileStream fs)
{
try
{
BinaryWriter bw = new BinaryWriter(fs);
long fileLength = fs.Length;
long writeBytes = 0;
Random random = new Random();
byte[] data = new byte[10240];
random.NextBytes(data);

for (; writeBytes < fileLength; writeBytes += 10240)
{
if (fileLength - writeBytes > 10240)
bw.Write(data);
else bw.Write(data, 0, (int)(fileLength - writeBytes));
}
fs.Flush();
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 將指定的流粉碎使用指定字符
/// </summary>
/// <param name="fs">文件流</param>
/// <param name="data">字符串</param>
/// <returns></returns>
public bool Shred(FileStream fs, byte data)
{
try
{
BinaryWriter bw = new BinaryWriter(fs);
long fileLength = fs.Length;
long writeBytes = 0;
for (; writeBytes < fileLength; writeBytes++)
{
bw.Write(data);
}
fs.Flush();
return true;
}
catch
{
return false;
}
}
/// <summary>
/// 將指定的流粉碎使用指定字符串
/// </summary>
/// <param name="fs">文件流</param>
/// <param name="data">字符串</param>
/// <returns></returns>
public bool Shred(FileStream fs, string data)
{
try
{
BinaryWriter bw = new BinaryWriter(fs);
long fileLength = fs.Length;
long writeBytes = 0;
char[] dataArry = new char[data.Length];
for (int ii = 0;ii<data.Length;ii++)
{
dataArry[ii] = data[ii];
}
int dataLength = dataArry.Length;
for (; writeBytes < fileLength; writeBytes += dataLength)
{
if ((fileLength - writeBytes) < dataLength)
bw.Write(dataArry);
else bw.Write(dataArry, 0, dataLength);
}
fs.Flush();
return true;
}
catch
{
return false;
}
}
public void RenameFile(string old, string last)
{
File.Move(old, last);
}
/// <summary>
/// 使用隨機數生成文件名
/// </summary>
/// <returns></returns>
private string ReandName()
{
Random random = new Random();
random.Next(1000).ToString();
return random.Next(1000).ToString() + random.Next(1000).ToString() + random.Next(1000).ToString();
}
/// <summary>
/// 開始粉碎
/// </summary>
/// <param name="fileName">文件名</param>
/// <param name="data">填充數據,ShredMode.RandData 將忽略 可為NULL</param>
/// <param name="sm">粉碎文件模式</param>
/// <returns>是否成功</returns>
public bool StartShredFile(string fileName, object data, ShredMode sm, bool IsCleanCreatedDate, bool IsCleanLastUsedDate, bool IsCleanName, bool IsEmptyFile)
{
FileStream fs = null;
try
{
fs = File.Open(fileName, FileMode.Open);
}
catch
{
//error
return false;
}
bool IsSucceed = false;
switch (sm)
{
case ShredMode.RandData:
IsSucceed = Shred(fs);
break;
case ShredMode.UserByte:
IsSucceed = Shred(fs, Convert.ToByte(data));
break;
case ShredMode.UserString:
IsSucceed = Shred(fs, (string)data);
break;

}
DateTime dt = new DateTime(2012,12,24);
try
{
FileInfo fi = new FileInfo(fileName);
string randName;
if (IsCleanName)
randName = ReandName();
else randName = @"\"+fi.Name;

fs.Close();
if(IsEmptyFile)
File.Open(fi.FullName, FileMode.Truncate).Close();
if(IsCleanName)
RenameFile(fi.FullName, fi.DirectoryName + randName);
if(IsCleanCreatedDate)
File.SetCreationTime(fi.DirectoryName + randName, dt);
if (IsCleanLastUsedDate)
{
if(IsCleanName)
File.SetLastWriteTime(fi.DirectoryName + randName, dt);
else
File.SetLastWriteTime(fi.FullName, dt);
}
File.Delete(fi.DirectoryName + randName);
}

catch
{
return false;
}
finally { fs.Close(); }
return IsSucceed;
}
}

}


>如何使用

 bool StartShredFile(string fileName, object data, ShredMode sm, bool IsCleanCreatedDate, bool IsCleanLastUsedDate, bool IsCleanName, bool IsEmptyFile) 

>>>使用指定方法粉碎文件並刪除

string filename : 文件名

ShredMode sm : 粉碎的方法(填充數據的類型)(RandData隨機數, UserByte指定的字節, UserString指定的字符串)

Object data : 填充的數據(根據ShredMode指定的方法拆箱)可以為string,byte,在ShredMode為RandData時可以為null

bool IsCleanCreatedDate : 是否更改創建日期(指定為2012,12,24)

bool IsCleanLastUsedDate :  是否更改最后使用日期(同上)

 

返回是否成功

 bool Shred(FileStream fs)

 內部方法>>>填充文件(沒來得及換名字,也算粉碎吧) 重載 0

將FileStream fs指定的文件填充為隨機數

 

返回是否成功

  bool Shred(FileStream fs, byte data)  

內部方法>>>填充文件(沒來得及換名字,也算粉碎吧) 重載 1

將FileStream fs指定的文件填充為byte data 的數據

 

返回是否成功

  bool Shred(FileStream fs, string data)  

內部方法>>>填充文件(沒來得及換名字,也算粉碎吧) 重載 2

將FileStream fs指定的文件填充為string data 的數據

 

返回是否成功

 枚舉 enum ShredMode  文件粉碎的方法

 隨機數
 RandData,
 指定的Byte
 UserByte,
 指定的字符串
 UserString

 

 

>>文件粉碎機

 

>>來看看效果

先創建許多文本文檔(1078個每個3kb)

然后粉碎

好了,我們看看能不能恢復

 

>看來是粉碎了,給個地址,大家下載吧

http://files.cnblogs.com/1119242459blog/FileShredder.rar


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM