ئەندازیاری نەرمەکاڵا (سۆفتوێر)

درووستکردنی پێرمادیڵیت: درووستکردنی مێثۆدەکانی سڕینەوەی فایل

پێرمادیڵیت بەرنامەیەکی سەرچاوەکراوەی سڕینەوی فایلی کۆمپیوتەرە. یەکێکە لە پڕۆژەکانی درەختی گەشەپێدەران. لە وتاری پێشتر باسی چۆنییەتی کارکردنی بەرنامەکەم کرد. ئەوجارەیان کەمێک سەیری کۆدەکان دەکەین.

بەشەکانی ئەو زنجیرە وتارە:

تێبینی گرنگ: ئەگەر دیسکەکەت SSD یە ئەوا واباشە ئەو بەرنامەیە لەسەری تاقی نەکەیتەوە. بۆ زانینی هۆکارەکەشی بەشی یەکەم بخوێنەوە. بەڵام دەتوانی هەندێک فایل لەسەر فلاش میمۆرییەک دابنێیت و بەرنامەکەی پێ تاقی بکەیتەوە.

پێرمادیڵیت بە C# درووستکراوە و فرەیموۆرکی WPF بەکاردەهێنێت. بۆیە یەکەمجار پڕۆژەیەکی WPF ی نوێ درووست بکە و دڵنیابەوە لەوەی کە بەرنامەکە .Net Framework 4.5 یان سەرووتر بەکاردەهێنێت، ئەوە گرنگە لەبەر ئەوەی دواتر async و await بەکار دەهێنین کە لە وەشانی 4.5 بۆ Dot net framework زیاد کران.

ئێستا MainWindow.xaml بکەوە و Grid ەکەی بەو شێوەیە دەستکاری بکە:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="*" />
    </Grid.RowDefinitions>

    <StackPanel Orientation="Horizontal" VerticalAlignment="Bottom" HorizontalAlignment="Center">
        <TextBlock Text="File Name: " FontSize="24"/>
        <TextBox x:Name="txtFileName" Width="280" FontSize="18"/>
    </StackPanel>

    <Button x:Name="buttonShred" Content="Shred" FontSize="24" Padding="30, 15" HorizontalAlignment="Center"
            VerticalAlignment="Center" Grid.Row="1" Click="buttonShred_Click" />
</Grid>

لەو کۆدەدا شتێکی وامان نەکردووە، تەنها تێکست بۆکسێکمان زیاد کردووە بۆ ئەوەی بەکارهێنەر بتوانێ ناوی ئەو فایلەی تێدا بنووسێت کە دەیەوێ بیسڕێتەوە لەگەڵ دوگمەیەکیش بۆ سڕینەوەی فایلەکە. ئێستا دەبێ ویندۆیەکە بەو شێوەیە بێت:

زۆر باشە. ئێستا دەچین شێوازی سڕینەوەی فایلەکە دەنووسین. یەکەمجار کڵاسێکی نوێ درووستبکە بە ناوی Shredder و ڤاریەبڵێک و کۆنستانتێکی بەو شێوەیەی تێدا پێناسە بکە:

using System;
using System.IO;

namespace FileShredder
{
    public class Shredder
    {
        private const int MAX_BUFFER_SIZE = 1024 * 1024; // One Megabyte
        static private Random _random = new Random(); // Used to get random numbers to replace over the original file data
        
        // The rest of the class goes here...
    }
}

لە کاتی کارکردن لەگەڵ دیسک واباشە بە کۆمەڵ داتاکان بنێری بۆ نووسین لە بڕی ئەوەی هەر Byteێک بە جیا بنێری، بەو شێوەیە خێراتر دەنووسرێ لەسەر دیسک. بۆیە ئێمە Array یەک بەکار دەهێن. MAX_BUFFER_SIZE یش قەبارەی ئەو ئەڕڕەیە دیاری دەکات. کە بە یەک مێگابایتمان داناوە. _random یش بۆ درووستکردنی ژمارەی هەڕەمەکی بەکاردەهێنین بۆ پڕکردنەوەی ئەو ئەڕڕەیەی باسمانکرد بۆ ئەوەی لەسەر داتای فایلەکەی بنووسین.

دوای ئەوە مێثۆدێک درووست دەکەین بۆ overwrite کردنی فایلەکان. کاری ئەو مێثۆدە ئەوەیە داتا ڕاستەقینەکەی فایلەکان بگۆڕێت بۆ داتای هەڕەمەکی و بێمانا. بەو شێوەیە فایلەکە بێکەڵک دەبێت. ئەو مێثۆدە بۆ کڵاسی Shredder زیاد بکە:

private static void OverWriteFile(FileInfo file)
{
    // 1. Open a stream from the file
    using (var stream = new FileStream(file.FullName, FileMode.Open, FileAccess.Write, FileShare.None))
    {
        // 2. Generate random numbers and store them in an array
        var buffer = new byte[MAX_BUFFER_SIZE];

       
        for (int i = 0; i < MAX_BUFFER_SIZE; i++)
        {
            // Random numbers are from 0 to 255. because each of them replace a byte of the file.
            buffer[i] = (byte)_random.Next(0, 255);
        }

        // 3. Now replace the file's actual content with the array of random numbers
        for (var length = file.Length; length > 0; length -= MAX_BUFFER_SIZE)
        {
            // Make sure we don't write more bytes than the file size
            int bytesToWrite = (length > MAX_BUFFER_SIZE) ? MAX_BUFFER_SIZE : (int)length;

            // Write the whole buffer over the file
            stream.Write(buffer, 0, bytesToWrite);

            // Flush as soon as possible. To make sure that the file is overwritten
            stream.Flush();
        }

        // 4. Set file size to 0
        stream.SetLength(0);
    }
}

هەر وەک دەبینی ئەو مێثۆدە بە چوار هەنگاو کاردەکات. لە هەنگاوی یەکەم Stream یێک بۆ ئەو فایلە دەکەینەوە کە دەمانەوێ بیسڕێنەوە. ئەوەیان گرینگە، لەبەر ئەوەی بێ ستریم ناتوانین دەستکاری فایلەکە بکەین. دواتر لە هەنگاوی دووەم ئەڕڕەیەک پێناسە دەکەین و دواتریش پڕی دەکەین لە ژمارەی هەڕەمەکی. لە هەنگاوی سێیەمیش ژمارە هەڕەمەکییەکان لەسەر داتا راستەقینەکە دەنووسین. لە هەنگاوی چوارەمیش قەبارەی فایلەکە دەکەینە سفر بۆ سەرلێشێواندنی بەرنامەکانی ڕیکەڤەریی فایل.

ئەو جارەیان مێثۆدێکی دیکە زیاد دەکەین بۆ تێکدانی مێتاداتای فایلەکە:

private static void DestroyFileMetadata(FileInfo file)
{
    // 1. Get the folder name that has the file
    var directoryName = Path.GetDirectoryName(file.FullName);

    // 2. Rename the file 5 times to remove it from the file system table.
    for (var round = 0; round < 5; round++)
    {
        var newPath = Path.Combine(directoryName, Path.GetRandomFileName());
        file.MoveTo(newPath);
    }

    // 3. Set all of the dates of the to Jan 1st 2000.
    var newTime = new DateTime(2000, 1, 1, 0, 0, 1);
    file.LastWriteTime = newTime;
    file.CreationTime = newTime;
    file.LastAccessTime = newTime;
}

لە هەنگاوی یەکەم شوێنی ئەو فۆڵدەرە وەردەگرین کە فایلەکەی تێدایە. دواتر ٥ جار فایلەکە ناوی فایلەکە دەگۆڕێن. لە هەنگاوی سێیەمیش هەموو بەروارەکانی فایلەکە (بەرواری درووستکردن، بەرواری دوایین خوێندنەوە، بەرواری دوایین دەستکاری) دەکەینە ١/١/٢٠٠٠

ئەگەر تێبینیت کردبێت هەردوو مێثۆد یەک پارامیتەر وەردەگرن لە جۆری FileInfo یە. ئێستا مێثۆدێکی دیکە درووست دەکەین کە پارامیتەرێکی String وەربگرێت و دڵنیاشببێتەوە کە ئەو Path ـەی کە وەریگرتووە بێ کێشەیە. ئەو مێثۆدە هەردوو مێثۆدەکەی دیکە بانگ دەکاتەوە و دواتر فایلەکە دەسڕێتەوە:

public static void ShredFile(string path)
{
    // 1. Make sure the file exists
    if (!File.Exists(path))
        throw new ArgumentException("The file does not exist: " + path);

    // 2. Get the file info
    FileInfo file = new FileInfo(path);

    // 3. Shred the file
    OverWriteFile(file);
    DestroyFileMetadata(file);
    File.Delete(path);
}

لە هەنگاوی یەکەمی ئەو مێثۆدە دڵنیا دەبینەوە کە ئەو فایلە بوونی هەیە. دواتر زانیاری فایلەکە وەردەگرین و لە نێو ڤاریەبڵێک هەڵی دەگرین. دواتر لە هەنگاوی سێیەم ئەو ڤارییەبڵە بەکاردەهێنین وەک پارامیتەر بۆ overwrite کردن و تێکدانی مێتاداتای فایلەکە. لە کۆتاییشدا فایلەکە دەسڕینەوە.

زۆرباشە، ئێستا کڵاسەکە ئامادەیە بۆ بەکارهێنان. بڕۆ MainWindow.xaml بکەوە و Click Handler ێک بۆ دوگمەی Shred زیاد بکە. بەو شێوەیە:

private void buttonShred_Click(object sender, RoutedEventArgs e)
{
    try
    {
        Shredder.ShredFile(txtFileName.Text);
        MessageBox.Show("The file was shredded successfuly!", "Success!");
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message, "There was an error", MessageBoxButton.OK, MessageBoxImage.Error);
    }
}

لێرەدا مێثۆدی ShredFile بەکاردەهێنینەوە و نووسینی ناو تێکست بۆکسەکەی بۆ دەنێرین. وە ئەگەر هەڵەیەکیش ڕوویدا، لە مێسج بۆکسێک بە بەکارهێنەرەکەی نیشان دەدەین.

ئێستا دەبێ بەرنامەکە ئامادەبێت. CTRL + F5 داگرە و تاقی بکەوە :)

هەرچەندە ئێستا بەرنامەکە کاردەکات، بەڵام کەموکورتی زۆرە. یەکێک لەوانەش کاتێک کلیک لەسەر دوگمەی Shred دەکەی، بەرنامەکە جام دەکات تاوەکو فایلەکە بەتەواوی دەسڕێتەوە. لە وتاری دابێ ان شاءالله باسی چارەسەری ئەو کێشەیەش دەکەم بە بەکارهێنانی Asynchronous Programming. بەڵام ئەگەر ناتوانی تا ئەو کات سەبر بگری، دەتوانی لێرە هەموو کۆدەکانی پێرمادیڵیت ببینی دایانبەزێنی. بۆ سڕینەوەی فایلەکان، سەیری کڵاسی ShredderService.cs بکە.

دەتوانی هەموو کۆدەکانی ئەو وتارە لێرە دابەزێنی

م
نووسراوە لەلایەنمحمد یاسین

قوتابی بەشی ئەندازیاریی سیستەمی زانیاری لە زانکۆی پۆلیتەکنیکی هەولێر