背景
ファイルをただ消してもhddの実体のデータは残ってると思いますので、ランダムなデータを上書きしてから消すという関数をためしに作ってみました。
関数の中で最終的にremove()を呼んでいるので、置き換えて使うことを想定しています。
計算方法
ファイルサイズの取得
今回の例では、sys/stat.hのstat()でファイルサイズを取得していますが、
fseek()でも良いのかも知れません。
#include <sys/stat.h>
struct stat sb;
if (stat(filename, &sb) == -1)
return 0;
stat構造体のst_sizeの値を読むことでファイルサイズが得られます。
ファイルサイズを表示する例
printf("file size: %zu\n", sb.st_size);
乱数の生成
乱数の生成はrand()ではなくstdlib.hにあるrandom()が推奨されるということなのでそれを使うことにします。random()の戻り値はunsigned long int型なので今使っているこのパソコンでは8bytesでした。
#include <time.h>
#include <stdlib.h>
unsigned long int r;
/*シードの初期化*/
srandom(time(NULL));
r = random();
ぴったり収まるように
先に、statで取得したファイルサイズ(st_size)とsizeof(unsigned long int)の商の数だけ書き込んで、最後に余りの個数だけ書き込んでいます。
例えばファイルサイズが1003bytesでsizeof(unsigned long int)が8bytesだとすると
1003 / 8 = 125
1003 % 8 = 1003 mod 8 = 3
ということになります
C言語の/演算子は整数の場合切り捨てになっていることに注意してください。
125回8bytesを書きこんで、のこり3Bytesを最後に書き込んでいます。
もっと良い書き方が有るかも知れません。
出来上がったコード
#include <sys/stat.h>
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
/**
* shred() - Overwrites with random data and removes.
* @filename filename
*
* Returns:
* 1: success
* 0: fail
*/
int shred(char *filename)
{
FILE *fp;
size_t i = 0;
unsigned long int r;
struct stat sb;
srandom(time(NULL));
if (stat(filename, &sb) == -1)
return 0;
fp = fopen(filename, "wb");
if (fp == NULL)
return 0;
i = sb.st_size / sizeof(unsigned long int);
while (i--) {
r = random();
if (!fwrite(&r, sizeof(unsigned long int), 1, fp))
return 0;
}
i = sb.st_size % sizeof(unsigned long int);
if (i) {
r = random();
if (!fwrite(&r, 1, i, fp))
return 0;
}
fclose(fp);
if (remove(filename) != 0)
return 0;
return 1;
}
何かの参考に慣れば幸いです。