Aggiunta struttura iniziale per il progetto BSHash

Sono stati creati nuovi file e modifiche significative al progetto `BSHash`, inclusi file di configurazione, codice sorgente e risorse. È stato creato un file di soluzione `BSHash.sln` e un file di configurazione `App.config` per gestire le impostazioni utente.

Il progetto `BSHash.csproj` è stato definito per specificare le proprietà e i riferimenti necessari. Sono stati implementati nuovi file sorgente, tra cui `Calculator.cs`, `Database.cs`, `Logger.cs`, `Network.cs`, `Storage.cs`, e `Main.cs`, che contengono la logica principale dell'applicazione.

È stata aggiunta una nuova interfaccia utente in `Main.Designer.cs` e sono stati creati file di risorse `Resources.resx` e `Resources.Designer.cs`. È stato aggiunto un file `AssemblyInfo.cs` per le informazioni sull'assembly e implementato un sistema di gestione delle impostazioni utente tramite `Settings.settings` e `Settings.Designer.cs`. Infine, è stato creato `Program.cs` per avviare l'applicazione.
This commit is contained in:
2025-08-17 22:45:51 +02:00
parent 5de577ce1e
commit 4b1a4dadb9
18 changed files with 2462 additions and 0 deletions

25
BSHash/BSHash.sln Normal file
View File

@@ -0,0 +1,25 @@
Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio Version 17
VisualStudioVersion = 17.11.35312.102
MinimumVisualStudioVersion = 10.0.40219.1
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BSHash", "BSHash\BSHash.csproj", "{108DFC74-04DA-484E-BB6B-DA1070B26C1A}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Any CPU = Debug|Any CPU
Release|Any CPU = Release|Any CPU
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{108DFC74-04DA-484E-BB6B-DA1070B26C1A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{108DFC74-04DA-484E-BB6B-DA1070B26C1A}.Debug|Any CPU.Build.0 = Debug|Any CPU
{108DFC74-04DA-484E-BB6B-DA1070B26C1A}.Release|Any CPU.ActiveCfg = Release|Any CPU
{108DFC74-04DA-484E-BB6B-DA1070B26C1A}.Release|Any CPU.Build.0 = Release|Any CPU
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE
EndGlobalSection
GlobalSection(ExtensibilityGlobals) = postSolution
SolutionGuid = {C6CACB7C-04A1-47E2-A248-E8B90455D44C}
EndGlobalSection
EndGlobal

30
BSHash/BSHash/App.config Normal file
View File

@@ -0,0 +1,30 @@
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<sectionGroup name="userSettings" type="System.Configuration.UserSettingsGroup, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089">
<section name="BSHash.Properties.Settings" type="System.Configuration.ClientSettingsSection, System, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" allowExeDefinition="MachineToLocalUser" requirePermission="false"/>
</sectionGroup>
</configSections>
<startup>
<supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.8"/>
</startup>
<userSettings>
<BSHash.Properties.Settings>
<setting name="Server" serializeAs="String">
<value/>
</setting>
<setting name="User" serializeAs="String">
<value/>
</setting>
<setting name="Password" serializeAs="String">
<value/>
</setting>
<setting name="Database" serializeAs="String">
<value/>
</setting>
<setting name="Path" serializeAs="String">
<value/>
</setting>
</BSHash.Properties.Settings>
</userSettings>
</configuration>

View File

@@ -0,0 +1,89 @@
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="15.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<Import Project="$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props" Condition="Exists('$(MSBuildExtensionsPath)\$(MSBuildToolsVersion)\Microsoft.Common.props')" />
<PropertyGroup>
<Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
<Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
<ProjectGuid>{108DFC74-04DA-484E-BB6B-DA1070B26C1A}</ProjectGuid>
<OutputType>WinExe</OutputType>
<RootNamespace>BSHash</RootNamespace>
<AssemblyName>BSHash</AssemblyName>
<TargetFrameworkVersion>v4.8</TargetFrameworkVersion>
<FileAlignment>512</FileAlignment>
<AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
<Deterministic>true</Deterministic>
<TargetFrameworkProfile />
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugSymbols>true</DebugSymbols>
<DebugType>full</DebugType>
<Optimize>false</Optimize>
<OutputPath>bin\Debug\</OutputPath>
<DefineConstants>DEBUG;TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Release|AnyCPU' ">
<PlatformTarget>AnyCPU</PlatformTarget>
<DebugType>pdbonly</DebugType>
<Optimize>true</Optimize>
<OutputPath>bin\Release\</OutputPath>
<DefineConstants>TRACE</DefineConstants>
<ErrorReport>prompt</ErrorReport>
<WarningLevel>4</WarningLevel>
</PropertyGroup>
<ItemGroup>
<Reference Include="System" />
<Reference Include="System.Core" />
<Reference Include="System.Xml.Linq" />
<Reference Include="System.Data.DataSetExtensions" />
<Reference Include="Microsoft.CSharp" />
<Reference Include="System.Data" />
<Reference Include="System.Deployment" />
<Reference Include="System.Drawing" />
<Reference Include="System.Net.Http" />
<Reference Include="System.Windows.Forms" />
<Reference Include="System.Xml" />
</ItemGroup>
<ItemGroup>
<Compile Include="Network.cs" />
<Compile Include="Storage.cs" />
<Compile Include="Logger.cs" />
<Compile Include="Calculator.cs" />
<Compile Include="Database.cs" />
<Compile Include="Main.cs">
<SubType>Form</SubType>
</Compile>
<Compile Include="Main.Designer.cs">
<DependentUpon>Main.cs</DependentUpon>
</Compile>
<Compile Include="Program.cs" />
<Compile Include="Properties\AssemblyInfo.cs" />
<EmbeddedResource Include="Main.resx">
<DependentUpon>Main.cs</DependentUpon>
</EmbeddedResource>
<EmbeddedResource Include="Properties\Resources.resx">
<Generator>ResXFileCodeGenerator</Generator>
<LastGenOutput>Resources.Designer.cs</LastGenOutput>
<SubType>Designer</SubType>
</EmbeddedResource>
<Compile Include="Properties\Resources.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Resources.resx</DependentUpon>
</Compile>
<None Include="Properties\Settings.settings">
<Generator>SettingsSingleFileGenerator</Generator>
<LastGenOutput>Settings.Designer.cs</LastGenOutput>
</None>
<Compile Include="Properties\Settings.Designer.cs">
<AutoGen>True</AutoGen>
<DependentUpon>Settings.settings</DependentUpon>
<DesignTimeSharedInput>True</DesignTimeSharedInput>
</Compile>
</ItemGroup>
<ItemGroup>
<None Include="App.config" />
</ItemGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
</Project>

View File

@@ -0,0 +1,44 @@
using System;
using System.Collections.Generic;
using System.IO;
using System.Security.Cryptography;
using System.Windows.Forms;
namespace BSHash
{
public class Calculator
{
private Logger _logger;
public Calculator(Logger logger)
{
_logger = logger;
}
public string CalculateHash(string filePath)
{
try
{
using (SHA256 sha256 = SHA256.Create())
{
using (FileStream fileStream = File.OpenRead(filePath))
{
byte[] hashBytes = sha256.ComputeHash(fileStream);
string hash = BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
_logger.Log("Hash " + hash + " calcolato per il file " + filePath.ToString(), LogType.INFO);
return hash;
}
}
}
catch (Exception ex)
{
// Log the exception or handle it as needed
_logger.Log("Errore nella lettura o hash del file " + filePath.ToString() + ".\nErrore: " + ex.Message.ToString(), LogType.ERROR);
return null;
}
}
}
}

242
BSHash/BSHash/Database.cs Normal file
View File

@@ -0,0 +1,242 @@
using System;
using System.Data;
using System.Data.SqlClient;
namespace BSHash
{
public class Database
{
private readonly string _connectionString;
public Database()
{
string serverstring = Properties.Settings.Default.Server;
string databasestring = Properties.Settings.Default.Database;
string userstring = Properties.Settings.Default.User;
string passwordstring = Properties.Settings.Default.Password;
// Ricompongo la stringa di connessione
_connectionString = $"Server={serverstring};Database={databasestring};User Id={userstring};Password={passwordstring};";
}
public bool ClearHash()
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
// Delete all rows from the Hash table
string deleteQuery = "DELETE FROM Hash";
using (SqlCommand deleteCommand = new SqlCommand(deleteQuery, connection, transaction))
{
deleteCommand.ExecuteNonQuery();
}
transaction.Commit();
return true;
}
catch
{
transaction.Rollback();
return false;
throw;
}
}
}
}
public bool HashExists(string hash)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
try
{
connection.Open();
// Controlla se l'hash esiste già nel database
string checkQuery = "SELECT COUNT(*) FROM Hash WHERE Hash = (@Hash)";
using (SqlCommand checkCommand = new SqlCommand(checkQuery, connection))
{
checkCommand.Parameters.AddWithValue("@Hash", hash);
int count = (int)checkCommand.ExecuteScalar();
return count != 0;
}
}
catch
{
return true;
throw;
}
}
}
public bool InsertHash(string path, string hash)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
// L'hash non esiste quindi lo inserisco
string insertQuery = "INSERT INTO Hash (Path, Hash) VALUES (@Path, @Hash)";
using (SqlCommand insertCommand = new SqlCommand(insertQuery, connection, transaction))
{
insertCommand.Parameters.AddWithValue("@Path", path);
insertCommand.Parameters.AddWithValue("@Hash", hash);
insertCommand.ExecuteNonQuery();
}
transaction.Commit();
return true;
}
catch
{
transaction.Rollback();
return false;
throw;
}
}
}
}
public bool UpdateHash(string path, string hash)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
// L'hash esiste quindi aggiorno la data di ultima scansione
string updateQuery = "UPDATE Hash SET Path = (@Path) WHERE Hash = (@Hash)";
using (SqlCommand updateCommand = new SqlCommand(updateQuery, connection, transaction))
{
updateCommand.Parameters.AddWithValue("@Path", path);
updateCommand.Parameters.AddWithValue("@Hash", hash);
updateCommand.ExecuteNonQuery();
}
transaction.Commit();
return true;
}
catch
{
transaction.Rollback();
return false;
throw;
}
}
}
}
public bool InsertHistory(string hash)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
// L'hash esiste quindi aggiorno la data di ultima scansione
string updateQuery = "INSERT INTO History (Hash) VALUES (@Hash)";
using (SqlCommand updateCommand = new SqlCommand(updateQuery, connection, transaction))
{
updateCommand.Parameters.AddWithValue("@Hash", hash);
updateCommand.ExecuteNonQuery();
}
transaction.Commit();
return true;
}
catch
{
transaction.Rollback();
return false;
throw;
}
}
}
}
public void InsertLog(string message, LogType type = LogType.INFO)
{
using (SqlConnection connection = new SqlConnection(_connectionString))
{
connection.Open();
using (SqlTransaction transaction = connection.BeginTransaction())
{
try
{
string query = "INSERT INTO Log (Message, Type) VALUES (@Message, @Type)";
using (SqlCommand command = new SqlCommand(query, connection, transaction))
{
command.Parameters.AddWithValue("@Message", message);
command.Parameters.AddWithValue("@Type", type);
command.ExecuteNonQuery();
}
transaction.Commit();
}
catch
{
transaction.Rollback();
throw;
}
}
}
}
public DataTable GetHashes()
{
DataTable hashes = new DataTable();
using (SqlConnection connection = new SqlConnection(_connectionString))
{
string query = "SELECT * FROM Hash";
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
hashes.Load(reader);
}
}
}
return hashes;
}
public DataTable GetLogs(string query)
{
DataTable logs = new DataTable();
using (SqlConnection connection = new SqlConnection(_connectionString))
{
using (SqlCommand command = new SqlCommand(query, connection))
{
connection.Open();
using (SqlDataReader reader = command.ExecuteReader())
{
logs.Load(reader);
}
}
}
return logs;
}
}
}

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.2 KiB

138
BSHash/BSHash/Logger.cs Normal file
View File

@@ -0,0 +1,138 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
namespace BSHash
{
public enum LogType
{
INFO,
DEBUG,
WARN,
ERROR,
FATAL,
TEST
}
public enum LogStatus
{
ATTESA,
PREPARAZIONE,
ELABORAZIONE,
FERMATA,
COMPLETATO,
ERRORE
}
public class Logger
{
private Database databaseHelper;
private System.Windows.Forms.TextBox logTextBox;
public Logger(System.Windows.Forms.TextBox logTextBox, Database databaseHelper)
{
this.logTextBox = logTextBox;
this.databaseHelper = databaseHelper;
}
public void Log(string message, LogType type = LogType.INFO)
{
databaseHelper.InsertLog(message, type);
}
public void LogEsecuzioneExecute(LogStatus stato, long spazioscansionato, long scansionati, int errori, int warning)
{
StringBuilder log = new StringBuilder();
log.Append("Stato procedura: " + LogStatusToString(stato) + Environment.NewLine);
log.Append("Totale spazio scansionato: " + ConvertBytesToReadableSize(spazioscansionato) + Environment.NewLine);
log.Append("Totale file scansionati: " + scansionati + Environment.NewLine);
log.Append("Errori: " + errori + Environment.NewLine);
log.Append("Warning: " + warning + Environment.NewLine);
SetLogTextBox(log.ToString());
}
public void LogDispositivoFill(LogStatus stato, int creati, int salvati, long spaziototale, long spazioriempito, int errori, int warning)
{
StringBuilder log = new StringBuilder();
log.Append("Stato procedura: " + LogStatusToString(stato) + Environment.NewLine);
log.Append("Spazio totale da riempire: " + ConvertBytesToReadableSize(spaziototale) + Environment.NewLine);
log.Append("Spazio occupato: " + ConvertBytesToReadableSize(spazioriempito) + Environment.NewLine);
log.Append("Totale file generati: " + creati + Environment.NewLine);
log.Append("Files salvati: " + salvati + Environment.NewLine);
log.Append("Errori: " + errori + Environment.NewLine);
log.Append("Warning: " + warning + Environment.NewLine);
SetLogTextBox(log.ToString());
}
public void LogDispositivoCheck(LogStatus stato, int totale, int elaborati, int inseriti, int presenti, int errori, int warning)
{
StringBuilder log = new StringBuilder();
log.Append("Stato procedura: " + LogStatusToString(stato) + Environment.NewLine);
log.Append("Totale da scansionare: " + totale + Environment.NewLine);
log.Append("Files scansionati: " + elaborati + Environment.NewLine);
log.Append("Files aggiornati: " + presenti + Environment.NewLine);
log.Append("Files inseriti: " + inseriti + Environment.NewLine);
log.Append("Errori: " + errori + Environment.NewLine);
log.Append("Warning: " + warning + Environment.NewLine);
SetLogTextBox(log.ToString());
}
public string LogStatusToString(LogStatus status)
{
switch (status)
{
case LogStatus.ATTESA:
return "In attesa di avvio";
case LogStatus.PREPARAZIONE:
return "Preparazione per l'elaborazione...";
case LogStatus.ELABORAZIONE:
return "In elaborazione...";
case LogStatus.FERMATA:
return "Stoppata dall'utente";
case LogStatus.COMPLETATO:
return "Completato";
case LogStatus.ERRORE:
return "Errore";
default:
return "In attesa di avvio";
}
}
public void SetLogTextBox(string log)
{
if (logTextBox.InvokeRequired)
{
logTextBox.Invoke(new Action(() => logTextBox.Text = log + Environment.NewLine));
}
else
{
logTextBox.Text = log + Environment.NewLine;
}
}
public static string ConvertBytesToReadableSize(long bytes)
{
string[] sizes = { "B", "KB", "MB", "GB", "TB" };
double len = bytes;
int order = 0;
while (len >= 1024 && order < sizes.Length - 1)
{
order++;
len = len / 1024;
}
return $"{len:0.##} {sizes[order]}";
}
}
}

507
BSHash/BSHash/Main.Designer.cs generated Normal file
View File

@@ -0,0 +1,507 @@
using System.Windows.Forms;
namespace BSHash
{
partial class Main
{
private System.ComponentModel.IContainer components = null;
protected override void Dispose(bool disposing)
{
if (disposing && (components != null))
{
components.Dispose();
}
base.Dispose(disposing);
}
private System.Windows.Forms.DataGridView dataGridViewLogRows;
private System.Windows.Forms.Label labelImpostazioniPassword;
private System.Windows.Forms.Label labelImpostazioniUser;
private System.Windows.Forms.TextBox textBoxImpostazioniPassword;
private System.Windows.Forms.TextBox textBoxImpostazioniUser;
private System.Windows.Forms.Label labelImpostazioniServer;
private System.Windows.Forms.TextBox textBoxImpostazioniServer;
private ToolTip toolTipCheck;
private System.Windows.Forms.Button buttonDispositivoSfoglia;
private System.Windows.Forms.Label labelDispositivoPath;
private System.Windows.Forms.TextBox textBoxDispositivoPath;
private System.Windows.Forms.ProgressBar progressBarDispositivo;
private System.Windows.Forms.Button buttonDispositivoStop;
private System.Windows.Forms.TextBox textBoxDispositivoLog;
private System.Windows.Forms.TextBox textBoxImpostazioniDatabase;
private System.Windows.Forms.Label labelImpostazioniDatabase;
private System.Windows.Forms.Button buttonImpostazioniSalva;
private System.Windows.Forms.Button buttonExecuteStop;
private System.Windows.Forms.Label labelImpostazioniPath;
private System.Windows.Forms.TextBox textBoxImpostazioniPath;
private System.Windows.Forms.Button buttonImpostazioniBrowse;
private System.Windows.Forms.Label labelLogQuery;
private System.Windows.Forms.TextBox textBoxLogQuery;
private System.Windows.Forms.Button buttonLogQuery;
private System.Windows.Forms.Label labelLogRecordNumber;
private System.Windows.Forms.Label labelLogRecord;
private System.Windows.Forms.Button buttonDispositivoStart;
private System.Windows.Forms.RadioButton radioButtonDispositivoClear;
private System.Windows.Forms.RadioButton radioButtonDispositivoCheck;
private System.Windows.Forms.RadioButton radioButtonDispositivoFill;
private System.Windows.Forms.GroupBox groupBoxDispositivoChoice;
private void InitializeComponent()
{
this.components = new System.ComponentModel.Container();
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(Main));
this.tabHash = new System.Windows.Forms.TabControl();
this.tabPageExecute = new System.Windows.Forms.TabPage();
this.buttonExecuteStop = new System.Windows.Forms.Button();
this.buttonExecuteStart = new System.Windows.Forms.Button();
this.textBoxExecuteLog = new System.Windows.Forms.TextBox();
this.tabPageDispositivo = new System.Windows.Forms.TabPage();
this.groupBoxDispositivoChoice = new System.Windows.Forms.GroupBox();
this.radioButtonDispositivoClear = new System.Windows.Forms.RadioButton();
this.radioButtonDispositivoCheck = new System.Windows.Forms.RadioButton();
this.radioButtonDispositivoFill = new System.Windows.Forms.RadioButton();
this.buttonDispositivoStart = new System.Windows.Forms.Button();
this.textBoxDispositivoLog = new System.Windows.Forms.TextBox();
this.progressBarDispositivo = new System.Windows.Forms.ProgressBar();
this.buttonDispositivoStop = new System.Windows.Forms.Button();
this.buttonDispositivoSfoglia = new System.Windows.Forms.Button();
this.labelDispositivoPath = new System.Windows.Forms.Label();
this.textBoxDispositivoPath = new System.Windows.Forms.TextBox();
this.tabPageLog = new System.Windows.Forms.TabPage();
this.labelLogRecordNumber = new System.Windows.Forms.Label();
this.labelLogRecord = new System.Windows.Forms.Label();
this.labelLogQuery = new System.Windows.Forms.Label();
this.textBoxLogQuery = new System.Windows.Forms.TextBox();
this.buttonLogQuery = new System.Windows.Forms.Button();
this.dataGridViewLogRows = new System.Windows.Forms.DataGridView();
this.tabPageImpostazioni = new System.Windows.Forms.TabPage();
this.buttonImpostazioniBrowse = new System.Windows.Forms.Button();
this.labelImpostazioniPath = new System.Windows.Forms.Label();
this.textBoxImpostazioniPath = new System.Windows.Forms.TextBox();
this.buttonImpostazioniSalva = new System.Windows.Forms.Button();
this.textBoxImpostazioniDatabase = new System.Windows.Forms.TextBox();
this.labelImpostazioniDatabase = new System.Windows.Forms.Label();
this.labelImpostazioniPassword = new System.Windows.Forms.Label();
this.labelImpostazioniUser = new System.Windows.Forms.Label();
this.textBoxImpostazioniPassword = new System.Windows.Forms.TextBox();
this.textBoxImpostazioniUser = new System.Windows.Forms.TextBox();
this.labelImpostazioniServer = new System.Windows.Forms.Label();
this.textBoxImpostazioniServer = new System.Windows.Forms.TextBox();
this.toolTipCheck = new System.Windows.Forms.ToolTip(this.components);
this.tabHash.SuspendLayout();
this.tabPageExecute.SuspendLayout();
this.tabPageDispositivo.SuspendLayout();
this.groupBoxDispositivoChoice.SuspendLayout();
this.tabPageLog.SuspendLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridViewLogRows)).BeginInit();
this.tabPageImpostazioni.SuspendLayout();
this.SuspendLayout();
//
// tabHash
//
this.tabHash.Alignment = System.Windows.Forms.TabAlignment.Left;
this.tabHash.Controls.Add(this.tabPageExecute);
this.tabHash.Controls.Add(this.tabPageDispositivo);
this.tabHash.Controls.Add(this.tabPageLog);
this.tabHash.Controls.Add(this.tabPageImpostazioni);
this.tabHash.Location = new System.Drawing.Point(12, 12);
this.tabHash.Multiline = true;
this.tabHash.Name = "tabHash";
this.tabHash.SelectedIndex = 0;
this.tabHash.Size = new System.Drawing.Size(675, 300);
this.tabHash.TabIndex = 0;
//
// tabPageExecute
//
this.tabPageExecute.Controls.Add(this.buttonExecuteStop);
this.tabPageExecute.Controls.Add(this.buttonExecuteStart);
this.tabPageExecute.Controls.Add(this.textBoxExecuteLog);
this.tabPageExecute.Location = new System.Drawing.Point(23, 4);
this.tabPageExecute.Name = "tabPageExecute";
this.tabPageExecute.Padding = new System.Windows.Forms.Padding(3);
this.tabPageExecute.Size = new System.Drawing.Size(648, 292);
this.tabPageExecute.TabIndex = 0;
this.tabPageExecute.Text = "Esecuzione";
this.tabPageExecute.UseVisualStyleBackColor = true;
//
// buttonExecuteStop
//
this.buttonExecuteStop.Enabled = false;
this.buttonExecuteStop.Location = new System.Drawing.Point(313, 6);
this.buttonExecuteStop.Name = "buttonExecuteStop";
this.buttonExecuteStop.Size = new System.Drawing.Size(327, 23);
this.buttonExecuteStop.TabIndex = 8;
this.buttonExecuteStop.Text = "Stop";
//
// buttonExecuteStart
//
this.buttonExecuteStart.Location = new System.Drawing.Point(9, 6);
this.buttonExecuteStart.Name = "buttonExecuteStart";
this.buttonExecuteStart.Size = new System.Drawing.Size(298, 23);
this.buttonExecuteStart.TabIndex = 4;
this.buttonExecuteStart.Text = "Avvia";
this.buttonExecuteStart.Click += new System.EventHandler(this.StartButton_Click);
//
// textBoxExecuteLog
//
this.textBoxExecuteLog.BackColor = System.Drawing.SystemColors.MenuText;
this.textBoxExecuteLog.ForeColor = System.Drawing.SystemColors.Menu;
this.textBoxExecuteLog.Location = new System.Drawing.Point(9, 35);
this.textBoxExecuteLog.Multiline = true;
this.textBoxExecuteLog.Name = "textBoxExecuteLog";
this.textBoxExecuteLog.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal;
this.textBoxExecuteLog.Size = new System.Drawing.Size(631, 251);
this.textBoxExecuteLog.TabIndex = 7;
//
// tabPageDispositivo
//
this.tabPageDispositivo.Controls.Add(this.groupBoxDispositivoChoice);
this.tabPageDispositivo.Controls.Add(this.buttonDispositivoStart);
this.tabPageDispositivo.Controls.Add(this.textBoxDispositivoLog);
this.tabPageDispositivo.Controls.Add(this.progressBarDispositivo);
this.tabPageDispositivo.Controls.Add(this.buttonDispositivoStop);
this.tabPageDispositivo.Controls.Add(this.buttonDispositivoSfoglia);
this.tabPageDispositivo.Controls.Add(this.labelDispositivoPath);
this.tabPageDispositivo.Controls.Add(this.textBoxDispositivoPath);
this.tabPageDispositivo.Location = new System.Drawing.Point(23, 4);
this.tabPageDispositivo.Name = "tabPageDispositivo";
this.tabPageDispositivo.Padding = new System.Windows.Forms.Padding(3);
this.tabPageDispositivo.Size = new System.Drawing.Size(648, 292);
this.tabPageDispositivo.TabIndex = 1;
this.tabPageDispositivo.Text = "Dispositivo";
this.tabPageDispositivo.UseVisualStyleBackColor = true;
//
// groupBoxDispositivoChoice
//
this.groupBoxDispositivoChoice.Controls.Add(this.radioButtonDispositivoClear);
this.groupBoxDispositivoChoice.Controls.Add(this.radioButtonDispositivoCheck);
this.groupBoxDispositivoChoice.Controls.Add(this.radioButtonDispositivoFill);
this.groupBoxDispositivoChoice.Location = new System.Drawing.Point(9, 32);
this.groupBoxDispositivoChoice.Name = "groupBoxDispositivoChoice";
this.groupBoxDispositivoChoice.Size = new System.Drawing.Size(160, 82);
this.groupBoxDispositivoChoice.TabIndex = 14;
this.groupBoxDispositivoChoice.TabStop = false;
this.groupBoxDispositivoChoice.Text = "Funzionalità";
//
// radioButtonDispositivoClear
//
this.radioButtonDispositivoClear.AutoSize = true;
this.radioButtonDispositivoClear.Location = new System.Drawing.Point(6, 59);
this.radioButtonDispositivoClear.Name = "radioButtonDispositivoClear";
this.radioButtonDispositivoClear.Size = new System.Drawing.Size(55, 17);
this.radioButtonDispositivoClear.TabIndex = 12;
this.radioButtonDispositivoClear.Text = "Pulisci";
this.radioButtonDispositivoClear.UseVisualStyleBackColor = true;
//
// radioButtonDispositivoCheck
//
this.radioButtonDispositivoCheck.AutoSize = true;
this.radioButtonDispositivoCheck.Checked = true;
this.radioButtonDispositivoCheck.Location = new System.Drawing.Point(6, 39);
this.radioButtonDispositivoCheck.Name = "radioButtonDispositivoCheck";
this.radioButtonDispositivoCheck.Size = new System.Drawing.Size(66, 17);
this.radioButtonDispositivoCheck.TabIndex = 11;
this.radioButtonDispositivoCheck.TabStop = true;
this.radioButtonDispositivoCheck.Text = "Controlla";
this.toolTipCheck.SetToolTip(this.radioButtonDispositivoCheck, resources.GetString("radioButtonDispositivoCheck.ToolTip"));
this.radioButtonDispositivoCheck.UseVisualStyleBackColor = true;
//
// radioButtonDispositivoFill
//
this.radioButtonDispositivoFill.AutoSize = true;
this.radioButtonDispositivoFill.Location = new System.Drawing.Point(6, 19);
this.radioButtonDispositivoFill.Name = "radioButtonDispositivoFill";
this.radioButtonDispositivoFill.Size = new System.Drawing.Size(57, 17);
this.radioButtonDispositivoFill.TabIndex = 10;
this.radioButtonDispositivoFill.Text = "Riempi";
this.radioButtonDispositivoFill.UseVisualStyleBackColor = true;
//
// buttonDispositivoStart
//
this.buttonDispositivoStart.Location = new System.Drawing.Point(175, 33);
this.buttonDispositivoStart.Name = "buttonDispositivoStart";
this.buttonDispositivoStart.Size = new System.Drawing.Size(467, 23);
this.buttonDispositivoStart.TabIndex = 13;
this.buttonDispositivoStart.Text = "Avvia";
this.buttonDispositivoStart.UseVisualStyleBackColor = true;
this.buttonDispositivoStart.Click += new System.EventHandler(this.buttonDispositivoStart_ClickAsync);
//
// textBoxDispositivoLog
//
this.textBoxDispositivoLog.BackColor = System.Drawing.SystemColors.MenuText;
this.textBoxDispositivoLog.ForeColor = System.Drawing.SystemColors.Menu;
this.textBoxDispositivoLog.Location = new System.Drawing.Point(9, 120);
this.textBoxDispositivoLog.Multiline = true;
this.textBoxDispositivoLog.Name = "textBoxDispositivoLog";
this.textBoxDispositivoLog.ScrollBars = System.Windows.Forms.ScrollBars.Horizontal;
this.textBoxDispositivoLog.Size = new System.Drawing.Size(633, 166);
this.textBoxDispositivoLog.TabIndex = 8;
//
// progressBarDispositivo
//
this.progressBarDispositivo.Location = new System.Drawing.Point(175, 91);
this.progressBarDispositivo.Name = "progressBarDispositivo";
this.progressBarDispositivo.Size = new System.Drawing.Size(467, 23);
this.progressBarDispositivo.TabIndex = 6;
//
// buttonDispositivoStop
//
this.buttonDispositivoStop.Enabled = false;
this.buttonDispositivoStop.Location = new System.Drawing.Point(175, 62);
this.buttonDispositivoStop.Name = "buttonDispositivoStop";
this.buttonDispositivoStop.Size = new System.Drawing.Size(467, 23);
this.buttonDispositivoStop.TabIndex = 5;
this.buttonDispositivoStop.Text = "Stop";
this.buttonDispositivoStop.UseVisualStyleBackColor = true;
this.buttonDispositivoStop.Click += new System.EventHandler(this.buttonDispositivoStop_Click);
//
// buttonDispositivoSfoglia
//
this.buttonDispositivoSfoglia.Location = new System.Drawing.Point(567, 4);
this.buttonDispositivoSfoglia.Name = "buttonDispositivoSfoglia";
this.buttonDispositivoSfoglia.Size = new System.Drawing.Size(75, 23);
this.buttonDispositivoSfoglia.TabIndex = 2;
this.buttonDispositivoSfoglia.Text = "Sfoglia";
this.buttonDispositivoSfoglia.UseVisualStyleBackColor = true;
this.buttonDispositivoSfoglia.Click += new System.EventHandler(this.buttonDispositivoSfoglia_Click);
//
// labelDispositivoPath
//
this.labelDispositivoPath.AutoSize = true;
this.labelDispositivoPath.Location = new System.Drawing.Point(6, 9);
this.labelDispositivoPath.Name = "labelDispositivoPath";
this.labelDispositivoPath.Size = new System.Drawing.Size(49, 13);
this.labelDispositivoPath.TabIndex = 1;
this.labelDispositivoPath.Text = "Percorso";
//
// textBoxDispositivoPath
//
this.textBoxDispositivoPath.Location = new System.Drawing.Point(61, 6);
this.textBoxDispositivoPath.Name = "textBoxDispositivoPath";
this.textBoxDispositivoPath.ReadOnly = true;
this.textBoxDispositivoPath.Size = new System.Drawing.Size(500, 20);
this.textBoxDispositivoPath.TabIndex = 0;
//
// tabPageLog
//
this.tabPageLog.Controls.Add(this.labelLogRecordNumber);
this.tabPageLog.Controls.Add(this.labelLogRecord);
this.tabPageLog.Controls.Add(this.labelLogQuery);
this.tabPageLog.Controls.Add(this.textBoxLogQuery);
this.tabPageLog.Controls.Add(this.buttonLogQuery);
this.tabPageLog.Controls.Add(this.dataGridViewLogRows);
this.tabPageLog.ImeMode = System.Windows.Forms.ImeMode.NoControl;
this.tabPageLog.Location = new System.Drawing.Point(23, 4);
this.tabPageLog.Name = "tabPageLog";
this.tabPageLog.Padding = new System.Windows.Forms.Padding(3);
this.tabPageLog.Size = new System.Drawing.Size(648, 292);
this.tabPageLog.TabIndex = 1;
this.tabPageLog.Text = "Log";
this.tabPageLog.UseVisualStyleBackColor = true;
//
// labelLogRecordNumber
//
this.labelLogRecordNumber.AutoSize = true;
this.labelLogRecordNumber.Location = new System.Drawing.Point(88, 276);
this.labelLogRecordNumber.Name = "labelLogRecordNumber";
this.labelLogRecordNumber.Size = new System.Drawing.Size(13, 13);
this.labelLogRecordNumber.TabIndex = 9;
this.labelLogRecordNumber.Text = "0";
//
// labelLogRecord
//
this.labelLogRecord.AutoSize = true;
this.labelLogRecord.Location = new System.Drawing.Point(6, 276);
this.labelLogRecord.Name = "labelLogRecord";
this.labelLogRecord.Size = new System.Drawing.Size(76, 13);
this.labelLogRecord.TabIndex = 8;
this.labelLogRecord.Text = "Record estratti";
//
// labelLogQuery
//
this.labelLogQuery.AutoSize = true;
this.labelLogQuery.Location = new System.Drawing.Point(6, 13);
this.labelLogQuery.Name = "labelLogQuery";
this.labelLogQuery.Size = new System.Drawing.Size(35, 13);
this.labelLogQuery.TabIndex = 7;
this.labelLogQuery.Text = "Query";
//
// textBoxLogQuery
//
this.textBoxLogQuery.Enabled = false;
this.textBoxLogQuery.Location = new System.Drawing.Point(47, 10);
this.textBoxLogQuery.Name = "textBoxLogQuery";
this.textBoxLogQuery.ReadOnly = true;
this.textBoxLogQuery.Size = new System.Drawing.Size(500, 20);
this.textBoxLogQuery.TabIndex = 6;
this.textBoxLogQuery.Text = "SELECT Date, Type, Message FROM Log ORDER BY Date DESC";
//
// buttonLogQuery
//
this.buttonLogQuery.Location = new System.Drawing.Point(553, 8);
this.buttonLogQuery.Name = "buttonLogQuery";
this.buttonLogQuery.Size = new System.Drawing.Size(89, 23);
this.buttonLogQuery.TabIndex = 5;
this.buttonLogQuery.Text = "Esegui";
this.buttonLogQuery.UseVisualStyleBackColor = true;
this.buttonLogQuery.Click += new System.EventHandler(this.buttonLogQuery_Click);
//
// dataGridViewLogRows
//
this.dataGridViewLogRows.AutoSizeColumnsMode = System.Windows.Forms.DataGridViewAutoSizeColumnsMode.Fill;
this.dataGridViewLogRows.ColumnHeadersHeightSizeMode = System.Windows.Forms.DataGridViewColumnHeadersHeightSizeMode.AutoSize;
this.dataGridViewLogRows.Location = new System.Drawing.Point(6, 37);
this.dataGridViewLogRows.Name = "dataGridViewLogRows";
this.dataGridViewLogRows.ReadOnly = true;
this.dataGridViewLogRows.SelectionMode = System.Windows.Forms.DataGridViewSelectionMode.FullRowSelect;
this.dataGridViewLogRows.Size = new System.Drawing.Size(636, 236);
this.dataGridViewLogRows.TabIndex = 0;
//
// tabPageImpostazioni
//
this.tabPageImpostazioni.Controls.Add(this.buttonImpostazioniBrowse);
this.tabPageImpostazioni.Controls.Add(this.labelImpostazioniPath);
this.tabPageImpostazioni.Controls.Add(this.textBoxImpostazioniPath);
this.tabPageImpostazioni.Controls.Add(this.buttonImpostazioniSalva);
this.tabPageImpostazioni.Controls.Add(this.textBoxImpostazioniDatabase);
this.tabPageImpostazioni.Controls.Add(this.labelImpostazioniDatabase);
this.tabPageImpostazioni.Controls.Add(this.labelImpostazioniPassword);
this.tabPageImpostazioni.Controls.Add(this.labelImpostazioniUser);
this.tabPageImpostazioni.Controls.Add(this.textBoxImpostazioniPassword);
this.tabPageImpostazioni.Controls.Add(this.textBoxImpostazioniUser);
this.tabPageImpostazioni.Controls.Add(this.labelImpostazioniServer);
this.tabPageImpostazioni.Controls.Add(this.textBoxImpostazioniServer);
this.tabPageImpostazioni.Location = new System.Drawing.Point(23, 4);
this.tabPageImpostazioni.Name = "tabPageImpostazioni";
this.tabPageImpostazioni.Padding = new System.Windows.Forms.Padding(3);
this.tabPageImpostazioni.Size = new System.Drawing.Size(648, 292);
this.tabPageImpostazioni.TabIndex = 1;
this.tabPageImpostazioni.Text = "Impostazioni";
this.tabPageImpostazioni.UseVisualStyleBackColor = true;
//
// buttonImpostazioniBrowse
//
this.buttonImpostazioniBrowse.Location = new System.Drawing.Point(567, 109);
this.buttonImpostazioniBrowse.Name = "buttonImpostazioniBrowse";
this.buttonImpostazioniBrowse.Size = new System.Drawing.Size(75, 23);
this.buttonImpostazioniBrowse.TabIndex = 11;
this.buttonImpostazioniBrowse.Text = "Sfoglia";
this.buttonImpostazioniBrowse.UseVisualStyleBackColor = true;
this.buttonImpostazioniBrowse.Click += new System.EventHandler(this.buttonImpostazioniBrowse_Click);
//
// labelImpostazioniPath
//
this.labelImpostazioniPath.AutoSize = true;
this.labelImpostazioniPath.Location = new System.Drawing.Point(6, 114);
this.labelImpostazioniPath.Name = "labelImpostazioniPath";
this.labelImpostazioniPath.Size = new System.Drawing.Size(49, 13);
this.labelImpostazioniPath.TabIndex = 10;
this.labelImpostazioniPath.Text = "Percorso";
//
// textBoxImpostazioniPath
//
this.textBoxImpostazioniPath.Location = new System.Drawing.Point(70, 111);
this.textBoxImpostazioniPath.Name = "textBoxImpostazioniPath";
this.textBoxImpostazioniPath.Size = new System.Drawing.Size(491, 20);
this.textBoxImpostazioniPath.TabIndex = 9;
//
// buttonImpostazioniSalva
//
this.buttonImpostazioniSalva.Location = new System.Drawing.Point(567, 137);
this.buttonImpostazioniSalva.Name = "buttonImpostazioniSalva";
this.buttonImpostazioniSalva.Size = new System.Drawing.Size(75, 23);
this.buttonImpostazioniSalva.TabIndex = 8;
this.buttonImpostazioniSalva.Text = "Salva";
this.buttonImpostazioniSalva.UseVisualStyleBackColor = true;
this.buttonImpostazioniSalva.Click += new System.EventHandler(this.buttonImpostazioniSalva_Click);
//
// textBoxImpostazioniDatabase
//
this.textBoxImpostazioniDatabase.Location = new System.Drawing.Point(70, 85);
this.textBoxImpostazioniDatabase.Name = "textBoxImpostazioniDatabase";
this.textBoxImpostazioniDatabase.Size = new System.Drawing.Size(572, 20);
this.textBoxImpostazioniDatabase.TabIndex = 7;
//
// labelImpostazioniDatabase
//
this.labelImpostazioniDatabase.AutoSize = true;
this.labelImpostazioniDatabase.Location = new System.Drawing.Point(6, 88);
this.labelImpostazioniDatabase.Name = "labelImpostazioniDatabase";
this.labelImpostazioniDatabase.Size = new System.Drawing.Size(53, 13);
this.labelImpostazioniDatabase.TabIndex = 6;
this.labelImpostazioniDatabase.Text = "Database";
//
// labelImpostazioniPassword
//
this.labelImpostazioniPassword.AutoSize = true;
this.labelImpostazioniPassword.Location = new System.Drawing.Point(6, 62);
this.labelImpostazioniPassword.Name = "labelImpostazioniPassword";
this.labelImpostazioniPassword.Size = new System.Drawing.Size(53, 13);
this.labelImpostazioniPassword.TabIndex = 5;
this.labelImpostazioniPassword.Text = "Password";
//
// labelImpostazioniUser
//
this.labelImpostazioniUser.AutoSize = true;
this.labelImpostazioniUser.Location = new System.Drawing.Point(6, 36);
this.labelImpostazioniUser.Name = "labelImpostazioniUser";
this.labelImpostazioniUser.Size = new System.Drawing.Size(39, 13);
this.labelImpostazioniUser.TabIndex = 4;
this.labelImpostazioniUser.Text = "Utente";
//
// textBoxImpostazioniPassword
//
this.textBoxImpostazioniPassword.Location = new System.Drawing.Point(70, 59);
this.textBoxImpostazioniPassword.Name = "textBoxImpostazioniPassword";
this.textBoxImpostazioniPassword.Size = new System.Drawing.Size(572, 20);
this.textBoxImpostazioniPassword.TabIndex = 3;
//
// textBoxImpostazioniUser
//
this.textBoxImpostazioniUser.Location = new System.Drawing.Point(70, 33);
this.textBoxImpostazioniUser.Name = "textBoxImpostazioniUser";
this.textBoxImpostazioniUser.Size = new System.Drawing.Size(572, 20);
this.textBoxImpostazioniUser.TabIndex = 2;
//
// labelImpostazioniServer
//
this.labelImpostazioniServer.AutoSize = true;
this.labelImpostazioniServer.Location = new System.Drawing.Point(6, 10);
this.labelImpostazioniServer.Name = "labelImpostazioniServer";
this.labelImpostazioniServer.Size = new System.Drawing.Size(38, 13);
this.labelImpostazioniServer.TabIndex = 1;
this.labelImpostazioniServer.Text = "Server";
//
// textBoxImpostazioniServer
//
this.textBoxImpostazioniServer.Location = new System.Drawing.Point(70, 7);
this.textBoxImpostazioniServer.Name = "textBoxImpostazioniServer";
this.textBoxImpostazioniServer.Size = new System.Drawing.Size(572, 20);
this.textBoxImpostazioniServer.TabIndex = 0;
//
// Main
//
this.ClientSize = new System.Drawing.Size(698, 323);
this.Controls.Add(this.tabHash);
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
this.MaximizeBox = false;
this.Name = "Main";
this.Text = "BS Hash Management";
this.tabHash.ResumeLayout(false);
this.tabPageExecute.ResumeLayout(false);
this.tabPageExecute.PerformLayout();
this.tabPageDispositivo.ResumeLayout(false);
this.tabPageDispositivo.PerformLayout();
this.groupBoxDispositivoChoice.ResumeLayout(false);
this.groupBoxDispositivoChoice.PerformLayout();
this.tabPageLog.ResumeLayout(false);
this.tabPageLog.PerformLayout();
((System.ComponentModel.ISupportInitialize)(this.dataGridViewLogRows)).EndInit();
this.tabPageImpostazioni.ResumeLayout(false);
this.tabPageImpostazioni.PerformLayout();
this.ResumeLayout(false);
}
}
}

330
BSHash/BSHash/Main.cs Normal file
View File

@@ -0,0 +1,330 @@
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Security.Cryptography;
using System.Security.Policy;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BSHash
{
public partial class Main : Form
{
//Grafica
public Button buttonExecuteStart;
public TextBox textBoxExecuteLog;
public Database databaseHelper;
public Calculator fileHashCalculator;
public Storage storage;
public TabControl tabHash;
public TabPage tabPageExecute;
public TabPage tabPageLog;
public TabPage tabPageDispositivo;
public TabPage tabPageImpostazioni;
public Logger logger;
public Logger loggerDispositivo;
//cancellazione
private CancellationTokenSource _cancellationTokenSource;
// Nella classe Main.cs
public Main()
{
InitializeComponent();
LoadSettings();
textBoxDispositivoPath.Text = Properties.Settings.Default.Path;
databaseHelper = new Database();
logger = new Logger(textBoxExecuteLog, databaseHelper);
loggerDispositivo = new Logger(textBoxDispositivoLog, databaseHelper);
fileHashCalculator = new Calculator(logger);
storage = new Storage(loggerDispositivo);
tabHash.SelectedIndexChanged += new EventHandler(tabControl_SelectedIndexChanged);
}
private async void StartButton_Click(object sender, EventArgs e)
{
// Inizializza il CancellationTokenSource
_cancellationTokenSource = new CancellationTokenSource();
CancellationToken cancellationToken = _cancellationTokenSource.Token;
// Disabilita i controlli durante l'esecuzione
buttonExecuteStart.Enabled = false;
buttonExecuteStop.Enabled = true;
long spazioscansionato = 0;
long scansionati = 0;
int errori = 0;
int warning = 0;
logger.LogEsecuzioneExecute(LogStatus.PREPARAZIONE, spazioscansionato, scansionati, errori, warning);
logger.Log("Inizio procedura principale.", LogType.INFO);
// Esegui il calcolo degli hash e l'inserimento nel database in un thread separato
await Task.Run(async () =>
{
while (!cancellationToken.IsCancellationRequested)
{
logger.Log("Scansione database... ", LogType.INFO);
DataTable hashes = databaseHelper.GetHashes();
int totalFiles = hashes.Rows.Count;
int processedFiles = 0;
logger.Log("Trovati " + totalFiles.ToString() + " da scansionare.", LogType.INFO);
foreach (DataRow row in hashes.Rows)
{
if (cancellationToken.IsCancellationRequested)
{
logger.Log("Procedura interrotta dall'utente.", LogType.WARN);
break;
}
string filePath = row["Path"].ToString();
string hash = row["Hash"].ToString();
processedFiles++;
scansionati++;
logger.Log("Scansione file " + processedFiles.ToString() + " / " + totalFiles.ToString() + ". Percorso: " + filePath, LogType.INFO);
if (!File.Exists(filePath))
{
logger.Log("Il file " + filePath + " non esiste.", LogType.ERROR);
continue;
}
FileInfo fileInfo = new FileInfo(filePath);
spazioscansionato += fileInfo.Length;
logger.Log("Calcolo hash per il file " + filePath + ".", LogType.INFO);
string calculatedHash = fileHashCalculator.CalculateHash(filePath);
if (calculatedHash == null)
{
logger.Log("Non è stato possibile calcolare l'hash del file " + filePath, LogType.ERROR);
continue;
}
if (calculatedHash != hash)
{
logger.Log("L'hash calcolato dal file (" + calculatedHash + ") è diverso da quell inserito nel database (" + hash + ")", LogType.ERROR);
continue;
}
Network network = new Network(logger);
var sendDataHashTask = network.SendDataHash(calculatedHash);
if (await sendDataHashTask != Network.OK)
{
logger.Log("Errore nell'invio dell'hash " + calculatedHash, LogType.INFO);
continue;
}
var getDataHashTask = network.GetDataHash(calculatedHash);
if (await getDataHashTask != Network.OK)
{
logger.Log("Errore nella ricezione della risposta dell'hash " + calculatedHash, LogType.INFO);
continue;
}
databaseHelper.InsertHistory(calculatedHash);
logger.LogEsecuzioneExecute(LogStatus.ELABORAZIONE, spazioscansionato, scansionati, errori, warning);
}
logger.Log("Calcolati correttamente " + processedFiles.ToString() + " su " + totalFiles.ToString() + ".", LogType.INFO);
}
}, cancellationToken);
logger.LogEsecuzioneExecute(LogStatus.FERMATA, spazioscansionato, scansionati, errori, warning);
logger.Log("Procedura terminata.", LogType.INFO);
// Riabilita i controlli dopo l'esecuzione
buttonExecuteStart.Enabled = true;
buttonExecuteStop.Enabled = false;
}
private void tabControl_SelectedIndexChanged(object sender, EventArgs e)
{
if (tabHash.SelectedTab == tabPageLog)
{
//LoadLogs();
}
}
private void LoadLogs()
{
DataTable logs = databaseHelper.GetLogs(textBoxLogQuery.Text);
dataGridViewLogRows.DataSource = logs;
labelLogRecordNumber.Text = dataGridViewLogRows.RowCount.ToString();
}
private void buttonDispositivoSfoglia_Click(object sender, EventArgs e)
{
using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
{
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
textBoxDispositivoPath.Text = folderBrowserDialog.SelectedPath;
}
}
}
private void LoadSettings()
{
textBoxImpostazioniServer.Text = Properties.Settings.Default.Server;
textBoxImpostazioniUser.Text = Properties.Settings.Default.User;
textBoxImpostazioniPassword.Text = Properties.Settings.Default.Password;
textBoxImpostazioniDatabase.Text = Properties.Settings.Default.Database;
textBoxImpostazioniPath.Text = Properties.Settings.Default.Path;
}
private void SaveSettings()
{
Properties.Settings.Default.Server = textBoxImpostazioniServer.Text;
Properties.Settings.Default.User = textBoxImpostazioniUser.Text;
Properties.Settings.Default.Password = textBoxImpostazioniPassword.Text;
Properties.Settings.Default.Database = textBoxImpostazioniDatabase.Text;
Properties.Settings.Default.Path = textBoxImpostazioniPath.Text;
Properties.Settings.Default.Save();
}
protected override void OnFormClosing(FormClosingEventArgs e)
{
SaveSettings();
base.OnFormClosing(e);
}
private void buttonImpostazioniSalva_Click(object sender, EventArgs e)
{
SaveSettings();
}
private void SetControlEnabled(bool enabled)
{
if (InvokeRequired)
{
Invoke(new Action<bool>(SetControlEnabled), enabled);
}
else
{
buttonDispositivoStart.Enabled = enabled;
buttonDispositivoStop.Enabled = !enabled;
}
}
private void buttonImpostazioniBrowse_Click(object sender, EventArgs e)
{
using (FolderBrowserDialog folderBrowserDialog = new FolderBrowserDialog())
{
if (folderBrowserDialog.ShowDialog() == DialogResult.OK)
{
textBoxImpostazioniPath.Text = folderBrowserDialog.SelectedPath;
}
}
}
private void buttonLogQuery_Click(object sender, EventArgs e)
{
LoadLogs();
}
private async void buttonDispositivoStart_ClickAsync(object sender, EventArgs e)
{
if (radioButtonDispositivoCheck.Checked)
{
// Controlla se il percorso esiste
if (!Directory.Exists(textBoxDispositivoPath.Text))
{
loggerDispositivo.Log("Errore: Il percorso specificato non esiste.", LogType.FATAL);
return;
}
loggerDispositivo.Log("Caricamento informazioni per esecuzione...", LogType.INFO);
// Disabilita i controlli prima dell'esecuzione e abilita il pulsante Stop
SetControlEnabled(false);
buttonDispositivoStop.Enabled = true;
// Esegui il riempimento del percorso in un thread separato
await Task.Run(() =>
{
// Avvio il riempimento del dispositivo
storage.StartCheckFiles(textBoxDispositivoPath.Text, progressBarDispositivo, buttonDispositivoStart, buttonDispositivoStop);
});
}
if(radioButtonDispositivoFill.Checked)
{
// Controlla se il percorso esiste
if (!Directory.Exists(textBoxDispositivoPath.Text))
{
loggerDispositivo.Log("Errore: Il percorso specificato non esiste.", LogType.FATAL);
return;
}
loggerDispositivo.Log("Caricamento informazioni per esecuzione...", LogType.INFO);
// Disabilita i controlli prima dell'esecuzione e abilita il pulsante Stop
SetControlEnabled(false);
buttonDispositivoStop.Enabled = true;
// Esegui il riempimento del percorso in un thread separato
await Task.Run(() =>
{
// Avvio il riempimento del dispositivo
storage.StartFillStorage(textBoxDispositivoPath.Text, progressBarDispositivo, buttonDispositivoStart, buttonDispositivoStop);
});
}
if (radioButtonDispositivoClear.Checked)
{
// Controlla se il percorso esiste
if (!Directory.Exists(textBoxDispositivoPath.Text))
{
loggerDispositivo.Log("Errore: Il percorso specificato non esiste.", LogType.FATAL);
return;
}
// Disabilita i controlli prima dell'esecuzione e abilita il pulsante Stop
SetControlEnabled(false);
buttonDispositivoStop.Enabled = true;
// Esegui la pulizia del percorso in un thread separato
await Task.Run(() =>
{
// Avvio la pulizia del dispositivo in un thread separato
storage.StartClearStorage(textBoxDispositivoPath.Text, progressBarDispositivo, buttonDispositivoStart, buttonDispositivoStop);
});
}
}
private void buttonDispositivoStop_Click(object sender, EventArgs e)
{
//Fermo l'attività avviata
storage.StopFillStorage(progressBarDispositivo, buttonDispositivoStart, buttonDispositivoStop);
//storage.StopCheckStorage(progressBarDispositivo, buttonDispositivoStart, buttonDispositivoStop);
storage.StopClearStorage(progressBarDispositivo, buttonDispositivoStart, buttonDispositivoStop);
// Riabilita i controlli dopo l'esecuzione
SetControlEnabled(true);
}
private void buttonExecuteStop_Click(object sender, EventArgs e)
{
// Annulla l'operazione
_cancellationTokenSource?.Cancel();
}
}
}

203
BSHash/BSHash/Main.resx Normal file
View File

@@ -0,0 +1,203 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:import namespace="http://www.w3.org/XML/1998/namespace" />
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" use="required" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
<xsd:attribute ref="xml:space" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<metadata name="toolTipCheck.TrayLocation" type="System.Drawing.Point, System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a">
<value>17, 17</value>
</metadata>
<data name="radioButtonDispositivoCheck.ToolTip" xml:space="preserve">
<value>Avviando questa procedura verrà ricreata la tabella Hash. Tutti gli Hash presenti verranno eliminati e inseriti quelli del nuovo percorso. Usarlo solo in caso di modifica sostanziale al percorso di scansione.</value>
</data>
<assembly alias="System.Drawing" name="System.Drawing, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" />
<data name="$this.Icon" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>
AAABAAEAICAAAAEAIACoEAAAFgAAACgAAAAgAAAAQAAAAAEAIAAAAAAAABAAAMMOAADDDgAAAAAAAAAA
AAD//////////9HCr/+HWSD/gksH/4JNC/+DUA//h1MQ/4xXEf+RXBP/l2EV/59nFv+obhj/rnMa/7N4
G/+5fR3/u38c/7t+G/+5fBr/s3ca/6huGP+haBf/mmMW/5JdFf+KVxP/hFMS/4BPEv9+TBL/g1Yi/8q4
pf/////////////////08e3/oHM9/5ZVBf+eWwj/oF0L/6FfDv+kYhD/p2US/6xqFP+xbxb/tXIX/7h2
GP+7eRj/vXsZ/758Gf++fBn/vnsY/7x6GP+6eBj/uHYW/7VzFf+ycBT/rWwT/6hoEv+iYxL/nF4S/5Za
Ev+QVRH/k2k3/+7q5P///////////+Tazv+aXxf/m1gH/5tZB/+gXAb/pmAE/6pkBP+rZgf/r2oI/7Ru
Cf+4cgj/u3UI/753B//BeQf/wnoH/8J6B//BeQf/v3gH/713CP+7dQj/uHMH/7VwBv+xbAb/rGkH/6Zk
Cf+fXgn/mVkK/5VWCv+NVxb/18u7////////////3s68/6BgEf+fWgj/ol4G/6VhBv+oYwX/rWcF/7Fr
B/+1bgj/unMI/753CP/Begj/xX0H/8d/B//IgAf/yIAH/8d/CP/Gfgj/xH0I/8F7CP++eAj/u3UI/7Zx
B/+xbgj/q2kJ/6VjCf+eXgr/mFkL/5BXD//NvKf////////////Yw6r/nlwL/59aB/+lXwb/qmQG/61m
Bv+zbAb/uHAH/7tzB/+/dwb/w3oH/8Z+B//KgQf/zIQG/86FBv/NhQf/zIUH/8uDB//IgQf/xn8I/8N9
CP+/egf/u3YI/7ZyCP+wbQn/qWcJ/6JhCv+cXAr/k1cM/8eyl////////////820lv+fXAf/pF4H/6Zg
B/+uZwf/t28H/7dvBv++dQf/wXgG/8R7Bf/Hfwb/y4IG/86GBv/RiAb/0ooH/9OKB//SiQf/0IgH/86G
B//LhQf/yIEH/8R+B/+/egj/unUI/7RwCP+uawn/p2UK/59fCv+WWQr/vqWF////////////xqmE/6Fd
Bv+mYQf/qWMG/7BpB/+1bQf/vHQI/8V7Cf/Eewj/yoEH/82DBv/Qhgb/1IoH/9aMB//Xjgf/2I8G/9eO
Bv/VjAf/04sH/9GJB//Nhgf/yYIH/8R+CP++eQj/uHQI/7JuCf+qaAr/o2IJ/5laCf+1mXT/////////
///BnnP/oV4G/6lkCP+sZQf/smsI/7ZvCP+8dAn/xHsK/82ECv/OhQn/0YgI/9WLB//Zjgf/2pEH/9qS
B//bkwf/2pIH/9mRB//YkAf/1Y0I/9GKCP/NhQf/x4EI/8J8Cf+8dgj/tXEJ/65rCf+mZAn/nF0I/7CP
ZP/9/f3//f3+/7iSYv+mYgf/qWQJ/61nCf+3bwr/vHQK/752Cf/Gfgr/0IYL/9CHC//VjQz/2ZAL/9yT
Cf/dlAj/35UI/96WCP/dlgj/3ZUJ/9uTCf/YkQn/1Y0I/9CICP/LhAj/xX4I/795Cf+4cwn/sW0J/6lm
Cf+gXwj/r4hV//r6+f/5+fj/r4VS/6lkCP+rZgn/smsL/7hwCv+/eAv/xX0M/8mBDP/Ohgz/1IwN/9aO
DP/clA//35cN/+CXCv/imQr/4poK/+KaCv/hmQn/3pcK/9uUCv/XkAn/0osI/82GCf/HgQj/wXsJ/7p1
Cf+zbwn/q2gJ/6NiCf+qgEb/9vTx//b08f+qfkX/qmUK/65pC/+0bgz/vXcM/8F6Df/Ffg3/zYcP/9OM
D//VjhD/2JIQ/9+YEv/gmQ//450P/+WeDv/mng3/5Z4M/+ScC//hmgr/3pcK/9qTCf/Ujgn/0IkJ/8qD
Cf/DfQn/vHcJ/7VxCf+tagn/pWMJ/6R2OP/w7Of/8u7p/6x7PP+saQz/s24N/7hzDf/Aeg7/w30Q/8iD
D//RixH/1I4S/9iTFP/clxT/35kU/+KeE//npRf/56MT/+mmFf/nohD/5aAP/+SdDv/gmgv/3JUL/9eQ
C//Siwv/zIUL/8R+C/+9eAv/t3IK/65rCv+mZQr/o3Ev/+zl2//s5t7/qXY0/65rEP+2chD/vHcQ/8J9
Ev/HgxP/zooV/9GNFf/UkRf/2ZYZ/92aGf/gnhr/5KIZ/+elGv/opxr/6qgZ/+mmFv/npBT/5qIV/+Kd
EP/emA//2ZIO/9ONDf/Nhg3/xoAN/795Df+4dAz/sG0M/6dmDP+ibif/5dvP/+Xb0P+lcSz/sG8T/7h1
FP++exX/xoMW/8uIGP/QjRr/1JIb/9aUHP/ZmB7/354f/+KhH//lpiH/6aoj/+urIf/rqhz/6qkc/+mn
Gv/moxf/46AX/96ZFP/ZlBL/1I8S/86IEf/HghD/wHsQ/7l1D/+xbg7/qWcO/59qIP/bz7//3tHC/6Ru
Jf+ychb/unkY/8GAGv/Ihhz/zYwe/9KRIP/WliL/2psk/92eJv/goij/4qUm/+arKv/qryz/6q4o/+uu
Jf/rrCL/6akg/+elHf/kohv/3pwZ/9uYGf/Wkxn/z4sX/8qFFf/BfRT/uncS/7NwEv+raRH/oWkd/9XG
sf/Xx7L/qHEm/7h7I/++gST/xIcl/8mMJv/Pkij/05Yp/9eZK//cny3/4aUv/+GmL//mrTH/5q0x/+iu
L//qsS//7LIv/+uwLf/rryz/6Ksn/+OkI//foCD/3Jsg/9eWIf/RkB7/yogc/8OAGf+9ehf/tnMX/65s
Fv+maxz/z7uh/866of+ueS//vok3/8KLNP/HjzP/y5My/8+XMv/TmzL/2J8z/96lNf/hqDb/46s2/+Wt
N//nsDn/6bM5/+u0OP/stTn/7LY5/+qyNf/orjD/5qwv/+GlK//anSj/2Jop/9KTJf/KiSL/x4Uf/8B+
Hv+5dx3/snEb/6puHf/Hro3/xa2O/7B9Mf/Bj0D/xpE9/8qVO//OmTr/0pw6/9WgOv/apTv/3qk9/+Kt
P//msUD/6LRA/+m1Qv/rt0P/67dD/+y5RP/rt0H/6rU+/+iyOv/mrjj/4ag1/92kMv/XnDD/0pYu/86Q
Kv/HiCb/woEl/7x7JP+0dCL/rHAg/8SmfP/Ao33/tYM3/8WUSf/Jl0X/zZpE/9GeQv/UoUL/2KVC/9up
RP/frUb/4rFH/+WzSf/ot0n/6rlK/+u5S//svE3/7LtM/+y5S//quEj/6LRE/+SwQf/irUD/3qc7/9ig
OP/VmzT/0JUw/8qNLf/Ehiz/vX8r/7Z4KP+ydib/wJxr/7uZa/+8iz//x5pR/8ucTv/PoEz/06NL/9am
Sv/aqkr/3a1M/+CxTf/jtFD/5bdS/+e5U//pu1P/671U/+y+Vv/svlj/7L5W/+u8U//ouVD/5rVO/+Ox
Sv/grEX/3KZB/9afPP/UnDr/zJI2/8aLNP/AhTL/uX0v/7Z7Kv+2jlf/s45Z/8GSSf/LoFr/zqJX/9Gl
Vf/VqVT/2atT/9yuU//fsVT/4bRW/+S4WP/mulr/6Lxb/+m9XP/rv13/7MFf/+zBX//swF//7L9d/+q8
W//mt1b/5LNS/+GwT//cqUr/2KRH/9ahQ//QmUH/yZE8/8KKOf+7gTX/t34v/7SHSP+wiEz/xZpV/82l
Yv/QqGD/06tf/9etXf/bsFz/3bNc/+C2XP/juF7/5btg/+e9Yv/pv2P/6sBk/+vBZf/rwmb/7MJm/+zD
Z//swWX/6b5j/+i8Yv/luF7/4LJY/92tVP/bqlH/0qBL/8+aSP/JlET/yJFA/8CIO/+4gTb/sYA9/7CG
Rf/Ko2P/0Kts/9Otaf/WsGj/2bNn/9y1Zv/ft2b/4bpm/+S8Z//mvmn/6MBq/+nCa//qw2z/68Nt/+vE
bv/rw23/68Nt/+vDbf/rwm3/6L9r/+W6Z//htmP/37Nf/9mrWP/VplT/0J5P/8yYS//Gkkf/wYxC/7yG
Pf+wfjP/rYI//8+scP/TsXX/1rNy/9m1cf/bt3H/3rlw/+G8cf/ivnH/5L9y/+bCc//ow3P/6sVz/+vF
dP/rxnX/68Z1/+rFdf/qxHT/6sR0/+rEdf/nwHP/5b1x/+G5bf/ds2j/2rBj/9apXf/QoVf/zJtS/8iW
Tf/Gk0j/v4xE/698MP+ugz3/07N9/9a3f//YuHz/2rp7/928e//gvnr/4sB7/+TCe//lxHz/58V8/+nG
fP/qx3z/68h9/+vIff/qyHz/6sd8/+nGe//oxXr/6MR7/+fCe//lwHn/4rx2/9+5c//ZsWv/1atm/9Oo
Yf/OoFj/yppS/8SUTv/Aj0z/r3wy/7SJRP/Wu4r/2b2J/9u+h//dv4X/38GE/+HDhf/kxYX/5ceG/+fI
hv/oyYb/6cqF/+rLhf/ry4X/68uF/+vKhP/qyYT/6ciC/+jGgv/nxYL/5cOC/+PBgf/iv3//4b19/9u1
df/XsHD/06pp/8+kYf/KnFr/xphW/8SWVf+ugjz/uY5L/9nAlf/awZX/3cOS/9/Ekf/hxZD/48eQ/+XJ
kP/ny5D/6MyP/+nNkP/qzY//686P/+zOjv/rzo3/682M/+rMjP/rz5T/6s+Y/+fKkv/mx47/5MWL/+PC
h//hwIX/3LqC/9azev/QrHX/zahv/8ula//IoWb/vJFT/8apf/+2jU7/2cCV/97Jo//gyqH/4syg/+TN
n//lzp//59Cf/+nRnv/q057/7NSf/+3Unv/t1J3/7tSd/+7UnP/u1J7/7tWi/+LDg//atm3/3bx8/9y9
gf/bu4L/2biB/9a0gf/TsoL/zq6B/8qqgP/JqoD/yKmA/8enfP/Ru57/9vPu/9S+nf/AnGL/z7B9/9S1
gf/YuIL/3L2E/+DCh//jxYj/5smJ/+nMi//pzYz/6syL/+jKif/myIn/5caJ/+C+fP/Ro07/17uE//bx
5v/9/fz//v7+//7+/v/+/v7//v7+///+/v///v7///7+/////v///v7//////////////////v7+/8mu
hv+reS7/tII3/7yJOf/EkTz/y5k//9OhQv/cq0b/4bJM/+K0Tf/is03/3rBL/9ipSP/To0X/z6FI/8ib
Sv/v59b////////+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+/v//////////////
////////5trH/7iNTf/Gm1z/zaJg/9KpZf/ZsWz/4btz/+nFef/vzoT/89OJ//PTiP/vzoL/6sh8/+XB
d//ctmz/0bBx//r48////v////7+///+/v///v7///7+///+/v///v7///7+///+/v///v7///7/////
///////////////////8+/n/zbKI/7iLQ/+8kEb/wpZJ/8idTP/OpFD/2K5U/+G5Xv/jvmH/4rxf/920
Wf/Tq1X/zqRS/8ukWP/q3cX////////+/v///v7///7+///+/v///v7///7+///+/v///v7///7+///+
/v///v//////////////////AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
</value>
</data>
</root>

99
BSHash/BSHash/Network.cs Normal file
View File

@@ -0,0 +1,99 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Http;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace BSHash
{
public class Network
{
private readonly HttpClient _httpClient;
private Logger _logger;
private static readonly Random _random = new Random();
// Costanti per i possibili stati di risposta
public static string OK = "OK";
public static string TIMEOUT = "TIMEOUT";
public static string ERROR = "ERROR";
public Network(Logger logger)
{
_httpClient = new HttpClient();
_logger = logger;
}
public async Task<string> SendDataHash(string hash)
{
try
{
/*
var content = new StringContent(data, Encoding.UTF8, "application/json");
HttpResponseMessage response = await _httpClient.PostAsync(url, content);
response.EnsureSuccessStatusCode();
string responseData = await response.Content.ReadAsStringAsync();
return responseData;
*/
_logger.Log("Invio dati...", LogType.INFO);
//Simula l'attesa di una risposta con un tempo randomico
//int delay = _random.Next(1, 5000); // da 1ms a 5s
int delay = 0; // per testare il timeout
_logger.Log("Dati inviati. Elaborazione... ", LogType.INFO);
Thread.Sleep(delay);
_logger.Log("Tempo di chiamata: " + delay.ToString(), LogType.INFO);
return OK;
}
catch (Exception ex)
{
// Logga o gestisci l'eccezione come necessario
_logger.Log("Errore della chiamata: " + ex.Message, LogType.ERROR);
return $"Error: {ex.Message}";
}
}
public async Task<string> GetDataHash(string hash)
{
try
{
/*
HttpResponseMessage response = await _httpClient.GetAsync(url);
response.EnsureSuccessStatusCode();
string responseData = await response.Content.ReadAsStringAsync();
return responseData;
*/
_logger.Log("Ricezione risposta...", LogType.INFO);
// Simula l'attesa di una risposta con un tempo randomico
//int delay = _random.Next(1, 5000); // da 1ms a 5s
int delay = 0; // per testare il timeout
_logger.Log("Risposta ricevuta. Elaborazione... ", LogType.INFO);
Thread.Sleep(delay);
_logger.Log("Tempo di risposta: " + delay.ToString(), LogType.INFO);
return OK;
}
catch (Exception ex)
{
// Logga o gestisci l'eccezione come necessario
_logger.Log("Errore della chiamata: " + ex.Message, LogType.ERROR);
return $"Error: {ex.Message}";
}
}
}
}

19
BSHash/BSHash/Program.cs Normal file
View File

@@ -0,0 +1,19 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BSHash
{
internal static class Program
{
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
Application.Run(new Main());
}
}
}

View File

@@ -0,0 +1,33 @@
using System.Reflection;
using System.Runtime.CompilerServices;
using System.Runtime.InteropServices;
// Le informazioni generali relative a un assembly sono controllate dal seguente
// set di attributi. Modificare i valori di questi attributi per modificare le informazioni
// associate a un assembly.
[assembly: AssemblyTitle("BSHash")]
[assembly: AssemblyDescription("")]
[assembly: AssemblyConfiguration("")]
[assembly: AssemblyCompany("")]
[assembly: AssemblyProduct("BSHash")]
[assembly: AssemblyCopyright("Copyright © 2024")]
[assembly: AssemblyTrademark("")]
[assembly: AssemblyCulture("")]
// Se si imposta ComVisible su false, i tipi in questo assembly non saranno visibili
// ai componenti COM. Se è necessario accedere a un tipo in questo assembly da
// COM, impostare su true l'attributo ComVisible per tale tipo.
[assembly: ComVisible(false)]
// Se il progetto viene esposto a COM, il GUID seguente verrà utilizzato come ID della libreria dei tipi
[assembly: Guid("108dfc74-04da-484e-bb6b-da1070b26c1a")]
// Le informazioni sulla versione di un assembly sono costituite dai seguenti quattro valori:
//
// Versione principale
// Versione secondaria
// Numero di build
// Revisione
//
[assembly: AssemblyVersion("1.0.0.0")]
[assembly: AssemblyFileVersion("1.0.0.0")]

View File

@@ -0,0 +1,71 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Codice generato da uno strumento.
// Versione runtime:4.0.30319.42000
//
// Le modifiche apportate a questo file possono causare un comportamento non corretto e andranno perse se
// il codice viene rigenerato.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BSHash.Properties
{
/// <summary>
/// Classe di risorse fortemente tipizzata per la ricerca di stringhe localizzate e così via.
/// </summary>
// Questa classe è stata generata automaticamente dalla classe StronglyTypedResourceBuilder
// tramite uno strumento quale ResGen o Visual Studio.
// Per aggiungere o rimuovere un membro, modificare il file .ResX, quindi eseguire di nuovo ResGen
// con l'opzione /str oppure ricompilare il progetto VS.
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "4.0.0.0")]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
internal class Resources
{
private static global::System.Resources.ResourceManager resourceMan;
private static global::System.Globalization.CultureInfo resourceCulture;
[global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")]
internal Resources()
{
}
/// <summary>
/// Restituisce l'istanza di ResourceManager memorizzata nella cache e usata da questa classe.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Resources.ResourceManager ResourceManager
{
get
{
if ((resourceMan == null))
{
global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("BSHash.Properties.Resources", typeof(Resources).Assembly);
resourceMan = temp;
}
return resourceMan;
}
}
/// <summary>
/// Esegue l'override della proprietà CurrentUICulture del thread corrente per tutte
/// le ricerche di risorse che utilizzano questa classe di risorse fortemente tipizzata.
/// </summary>
[global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)]
internal static global::System.Globalization.CultureInfo Culture
{
get
{
return resourceCulture;
}
set
{
resourceCulture = value;
}
}
}
}

View File

@@ -0,0 +1,117 @@
<?xml version="1.0" encoding="utf-8"?>
<root>
<!--
Microsoft ResX Schema
Version 2.0
The primary goals of this format is to allow a simple XML format
that is mostly human readable. The generation and parsing of the
various data types are done through the TypeConverter classes
associated with the data types.
Example:
... ado.net/XML headers & schema ...
<resheader name="resmimetype">text/microsoft-resx</resheader>
<resheader name="version">2.0</resheader>
<resheader name="reader">System.Resources.ResXResourceReader, System.Windows.Forms, ...</resheader>
<resheader name="writer">System.Resources.ResXResourceWriter, System.Windows.Forms, ...</resheader>
<data name="Name1"><value>this is my long string</value><comment>this is a comment</comment></data>
<data name="Color1" type="System.Drawing.Color, System.Drawing">Blue</data>
<data name="Bitmap1" mimetype="application/x-microsoft.net.object.binary.base64">
<value>[base64 mime encoded serialized .NET Framework object]</value>
</data>
<data name="Icon1" type="System.Drawing.Icon, System.Drawing" mimetype="application/x-microsoft.net.object.bytearray.base64">
<value>[base64 mime encoded string representing a byte array form of the .NET Framework object]</value>
<comment>This is a comment</comment>
</data>
There are any number of "resheader" rows that contain simple
name/value pairs.
Each data row contains a name, and value. The row also contains a
type or mimetype. Type corresponds to a .NET class that support
text/value conversion through the TypeConverter architecture.
Classes that don't support this are serialized and stored with the
mimetype set.
The mimetype is used for serialized objects, and tells the
ResXResourceReader how to depersist the object. This is currently not
extensible. For a given mimetype the value must be set accordingly:
Note - application/x-microsoft.net.object.binary.base64 is the format
that the ResXResourceWriter will generate, however the reader can
read any of the formats listed below.
mimetype: application/x-microsoft.net.object.binary.base64
value : The object must be serialized with
: System.Serialization.Formatters.Binary.BinaryFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.soap.base64
value : The object must be serialized with
: System.Runtime.Serialization.Formatters.Soap.SoapFormatter
: and then encoded with base64 encoding.
mimetype: application/x-microsoft.net.object.bytearray.base64
value : The object must be serialized into a byte array
: using a System.ComponentModel.TypeConverter
: and then encoded with base64 encoding.
-->
<xsd:schema id="root" xmlns="" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:msdata="urn:schemas-microsoft-com:xml-msdata">
<xsd:element name="root" msdata:IsDataSet="true">
<xsd:complexType>
<xsd:choice maxOccurs="unbounded">
<xsd:element name="metadata">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" />
<xsd:attribute name="type" type="xsd:string" />
<xsd:attribute name="mimetype" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="assembly">
<xsd:complexType>
<xsd:attribute name="alias" type="xsd:string" />
<xsd:attribute name="name" type="xsd:string" />
</xsd:complexType>
</xsd:element>
<xsd:element name="data">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
<xsd:element name="comment" type="xsd:string" minOccurs="0" msdata:Ordinal="2" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" msdata:Ordinal="1" />
<xsd:attribute name="type" type="xsd:string" msdata:Ordinal="3" />
<xsd:attribute name="mimetype" type="xsd:string" msdata:Ordinal="4" />
</xsd:complexType>
</xsd:element>
<xsd:element name="resheader">
<xsd:complexType>
<xsd:sequence>
<xsd:element name="value" type="xsd:string" minOccurs="0" msdata:Ordinal="1" />
</xsd:sequence>
<xsd:attribute name="name" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:choice>
</xsd:complexType>
</xsd:element>
</xsd:schema>
<resheader name="resmimetype">
<value>text/microsoft-resx</value>
</resheader>
<resheader name="version">
<value>2.0</value>
</resheader>
<resheader name="reader">
<value>System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
<resheader name="writer">
<value>System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089</value>
</resheader>
</root>

View File

@@ -0,0 +1,86 @@
//------------------------------------------------------------------------------
// <auto-generated>
// Il codice è stato generato da uno strumento.
// Versione runtime:4.0.30319.42000
//
// Le modifiche apportate a questo file possono provocare un comportamento non corretto e andranno perse se
// il codice viene rigenerato.
// </auto-generated>
//------------------------------------------------------------------------------
namespace BSHash.Properties {
[global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()]
[global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "17.11.0.0")]
internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase {
private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings())));
public static Settings Default {
get {
return defaultInstance;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string Server {
get {
return ((string)(this["Server"]));
}
set {
this["Server"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string User {
get {
return ((string)(this["User"]));
}
set {
this["User"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string Password {
get {
return ((string)(this["Password"]));
}
set {
this["Password"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string Database {
get {
return ((string)(this["Database"]));
}
set {
this["Database"] = value;
}
}
[global::System.Configuration.UserScopedSettingAttribute()]
[global::System.Diagnostics.DebuggerNonUserCodeAttribute()]
[global::System.Configuration.DefaultSettingValueAttribute("")]
public string Path {
get {
return ((string)(this["Path"]));
}
set {
this["Path"] = value;
}
}
}
}

View File

@@ -0,0 +1,21 @@
<?xml version='1.0' encoding='utf-8'?>
<SettingsFile xmlns="http://schemas.microsoft.com/VisualStudio/2004/01/settings" CurrentProfile="(Default)" GeneratedClassNamespace="BSHash.Properties" GeneratedClassName="Settings">
<Profiles />
<Settings>
<Setting Name="Server" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="User" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="Password" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="Database" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
<Setting Name="Path" Type="System.String" Scope="User">
<Value Profile="(Default)" />
</Setting>
</Settings>
</SettingsFile>

408
BSHash/BSHash/Storage.cs Normal file
View File

@@ -0,0 +1,408 @@
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices;
using System.Runtime.InteropServices.ComTypes;
using System.Security.Cryptography;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
namespace BSHash
{
public class Storage
{
private readonly Logger _logger;
private readonly Random _random = new Random();
private CancellationTokenSource _cancellationTokenSource;
public Storage(Logger logger)
{
_logger = logger;
}
public void StartClearStorage(string path, System.Windows.Forms.ProgressBar progressBar, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
_cancellationTokenSource = new CancellationTokenSource();
startButton.Enabled = false;
stopButton.Enabled = true;
Task.Run(async () => await ClearStorageAsync(path, progressBar, _cancellationTokenSource.Token, startButton, stopButton));
}
public void StartFillStorage(string path, System.Windows.Forms.ProgressBar progressBar, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
_cancellationTokenSource = new CancellationTokenSource();
startButton.Enabled = false;
stopButton.Enabled = true;
Task.Run(async () => await FillStorageAsync(path, progressBar, _cancellationTokenSource.Token, startButton, stopButton));
}
public void StartCheckFiles(string path, System.Windows.Forms.ProgressBar progressBar, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
_cancellationTokenSource = new CancellationTokenSource();
startButton.Enabled = false;
stopButton.Enabled = true;
Task.Run(async () => await CheckFilesAsync(path, progressBar, _cancellationTokenSource.Token, startButton, stopButton));
}
internal void StopFillStorage(System.Windows.Forms.ProgressBar progressBar, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
_cancellationTokenSource?.Cancel();
startButton.Invoke((Action)(() => startButton.Enabled = true));
stopButton.Invoke((Action)(() => stopButton.Enabled = false));
}
internal void StopClearStorage(System.Windows.Forms.ProgressBar progressBar, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
_cancellationTokenSource?.Cancel();
startButton.Invoke((Action)(() => startButton.Enabled = true));
stopButton.Invoke((Action)(() => stopButton.Enabled = false));
}
internal void StoptCkeckFiles(System.Windows.Forms.ProgressBar progressBar, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
_cancellationTokenSource?.Cancel();
startButton.Invoke((Action)(() => startButton.Enabled = true));
stopButton.Invoke((Action)(() => stopButton.Enabled = false));
}
private async Task ClearStorageAsync(string path, System.Windows.Forms.ProgressBar progressBar, CancellationToken cancellationToken, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
var stopwatch = Stopwatch.StartNew();
var elapsedTimes = new Queue<double>();
const int maxSamples = 10; // Numero di campioni per la media mobile
try
{
string[] files = Directory.GetFiles(path, "*");
long totalFiles = files.Length;
long deletedFiles = 0;
var progress = new Progress<int>(value => progressBar.Value = value);
progressBar.Maximum = 100;
progressBar.Value = 0;
foreach (string file in files)
{
if (cancellationToken.IsCancellationRequested)
{
_logger.Log("Cancellazione interrotta dall'utente.", LogType.ERROR);
break;
}
try
{
File.Delete(file);
deletedFiles++;
int progressValue = (int)(deletedFiles * 100 / totalFiles);
((IProgress<int>)progress).Report(Math.Min(progressValue, 100));
_logger.Log($"Cancellato file {file}.", LogType.INFO);
// Calcola il tempo rimanente usando una media mobile
double elapsedSeconds = stopwatch.Elapsed.TotalSeconds;
elapsedTimes.Enqueue(elapsedSeconds / deletedFiles);
if (elapsedTimes.Count > maxSamples)
{
elapsedTimes.Dequeue();
}
double averageTimePerFile = elapsedTimes.Average();
double estimatedTotalSeconds = averageTimePerFile * totalFiles;
double remainingSeconds = estimatedTotalSeconds - elapsedSeconds;
_logger.Log($"Tempo rimanente stimato: {TimeSpan.FromSeconds(remainingSeconds):hh\\:mm\\:ss}", LogType.INFO);
}
catch (IOException ex)
{
_logger.Log($"Errore durante la cancellazione del file {file}: {ex.Message}", LogType.ERROR);
}
}
_logger.Log("Cancellazione completata.", LogType.INFO);
}
catch (Exception ex)
{
_logger.Log($"Errore durante la cancellazione dei file: {ex.Message}", LogType.ERROR);
}
finally
{
stopwatch.Stop();
startButton.Invoke((Action)(() => startButton.Enabled = true));
stopButton.Invoke((Action)(() => stopButton.Enabled = false));
}
}
private async Task FillStorageAsync(string path, System.Windows.Forms.ProgressBar progressBar, CancellationToken cancellationToken, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
try
{
_logger.LogDispositivoFill(LogStatus.ELABORAZIONE, 0, 0, 0, 0, 0, 0);
string drive = Path.GetPathRoot(path);
DriveInfo driveInfo = new DriveInfo(drive);
long initialFreeSpace = driveInfo.AvailableFreeSpace;
var progress = new Progress<int>(value =>
{
if (progressBar.InvokeRequired)
{
progressBar.Invoke((Action)(() => progressBar.Value = value));
}
else
{
progressBar.Value = value;
}
});
progressBar.Maximum = 100;
progressBar.Value = 0;
long usedSpace = 0;
int creati = 0;
int salvati = 0;
int errori = 0;
int warning = 0;
int sectorSize = GetSectorSize(drive);
_logger.LogDispositivoFill(LogStatus.ELABORAZIONE, creati, salvati, initialFreeSpace, usedSpace, errori, warning);
while (usedSpace < initialFreeSpace)
{
if (cancellationToken.IsCancellationRequested)
{
_logger.Log("Riempimento interrotto dall'utente.", LogType.ERROR);
break;
}
long fileSize = await CreateRandomFileAsync(path, sectorSize);
usedSpace += fileSize;
creati++;
salvati++;
double progressValue = (usedSpace * 100 / initialFreeSpace);
((IProgress<int>)progress).Report(Math.Min((int)progressValue, 100));
_logger.Log($"Progresso {progressValue}%. ({usedSpace}/{initialFreeSpace})", LogType.INFO);
if (usedSpace >= initialFreeSpace)
{
_logger.Log("Il dispositivo è pieno.", LogType.WARN);
break;
}
_logger.LogDispositivoFill(LogStatus.ELABORAZIONE, creati, salvati, initialFreeSpace, usedSpace, errori, warning);
}
_logger.LogDispositivoFill(LogStatus.COMPLETATO, creati, salvati, initialFreeSpace, usedSpace, errori, warning);
}
catch (IOException ex)
{
string drive = Path.GetPathRoot(path);
DriveInfo driveInfo = new DriveInfo(drive);
if (driveInfo.AvailableFreeSpace > 0)
{
_logger.Log($"Errore di I/O durante il riempimento del dispositivo: {ex.Message}", LogType.ERROR);
_logger.LogDispositivoFill(LogStatus.ERRORE, 0, 0, 0, 0, 0, 0);
}
else
{
_logger.Log("Il dispositivo è pieno.", LogType.WARN);
_logger.LogDispositivoFill(LogStatus.COMPLETATO, 0, 0, 0, 0, 0, 0);
}
}
}
private async Task<long> CreateRandomFileAsync(string path, int sectorSize)
{
try
{
string fileName = Path.Combine(path, Guid.NewGuid() + ".bs");
byte[] data = new byte[sectorSize];
_random.NextBytes(data);
await WriteAllBytesAsync(fileName, data);
_logger.Log($"Creato file {fileName}.", LogType.INFO);
return data.Length;
}
catch (Exception ex) when (ex is IOException || ex is UnauthorizedAccessException)
{
_logger.Log($"Errore durante la creazione del file: {ex.Message}", LogType.ERROR);
return 0;
}
}
private async Task WriteAllBytesAsync(string path, byte[] bytes)
{
using (FileStream fs = new FileStream(path, FileMode.Create, FileAccess.Write, FileShare.None, 4096, true))
{
await fs.WriteAsync(bytes, 0, bytes.Length);
}
}
private int GetSectorSize(string drive)
{
// Assuming a default sector size of 1024 * 1024 * 128 bytes (128 MB)
// Total 127.831.113.728 bytes
// : 128 = 998.680.576
// : 1024 = 975.274
// : 1024 = 952
return 1024 * 128;
}
public async Task CheckFilesAsync(string path, System.Windows.Forms.ProgressBar progressBar, CancellationToken cancellationToken, System.Windows.Forms.Button startButton, System.Windows.Forms.Button stopButton)
{
// Controlla se l'hash è già presente nel database
Database database = new Database();
_logger.Log($"Scansione percorso {path}...", LogType.INFO);
_logger.LogDispositivoCheck(LogStatus.PREPARAZIONE, 0, 0, 0, 0, 0, 0);
// Pulisci il database
database.ClearHash();
try
{
_logger.Log("Ricavando la lista dei files supportati...", LogType.INFO); ;
string[] files = Directory.GetFiles(path, "*", SearchOption.AllDirectories);
var hashSet = new HashSet<string>();
var invalidFiles = new List<string>();
var duplicateFiles = new List<string>();
progressBar.Invoke((Action)(() =>
{
progressBar.Maximum = files.Length;
progressBar.Value = 0;
}));
int processedFiles = 0;
int errori = 0;
int warning = 0;
int inseriti = 0;
int aggiornati = 0;
int totalFiles = files.Length;
_logger.Log($"Inizio controllo {totalFiles} files.", LogType.INFO);
foreach (string file in files)
{
processedFiles++;
_logger.Log($"({processedFiles}/{totalFiles}) Verifica file {file}...", LogType.INFO);
if (cancellationToken.IsCancellationRequested)
{
_logger.Log("Scansione interrotta dall'utente.", LogType.ERROR);
break;
}
try
{
string hash = await ComputeFileHashAsync(file);
if (hashSet.Contains(hash))
{
duplicateFiles.Add(file);
}
else
{
hashSet.Add(hash);
}
_logger.Log("Verificando l'esistenza dell'hash...", LogType.INFO);
// Controlla se l'hash esiste già nel database
if (database.HashExists(hash))
{
_logger.Log("Hash esistente. Aggiornando hash... ", LogType.INFO);
// L'hash esiste già nel database, aggiorna il percorso del file
if(database.UpdateHash(file, hash))
{
_logger.Log("Hash aggiornato con successo.", LogType.INFO);
aggiornati++;
}
else
{
_logger.Log("Errore durante l'aggiornamento dell'hash.", LogType.ERROR);
errori++;
}
}
else
{
_logger.Log("Hash non presente. Inserendo hash... ", LogType.INFO);
// L'hash non esiste nel database, inseriscilo
if (database.InsertHash(file, hash))
{
_logger.Log("Hash inserito con successo.", LogType.INFO);
inseriti++;
}
else
{
_logger.Log("Errore durante l'inserimento dell'hash.", LogType.ERROR);
errori++;
}
}
_logger.LogDispositivoCheck(LogStatus.ELABORAZIONE, totalFiles, processedFiles, inseriti, aggiornati, errori, warning);
}
catch (Exception ex)
{
invalidFiles.Add(file);
_logger.Log($"Errore durante la verifica del file {file}: {ex.Message}", LogType.ERROR);
errori++;
}
progressBar.Invoke((Action)(() => progressBar.Value = processedFiles));
}
if (invalidFiles.Count > 0)
{
_logger.Log($"Trovati {invalidFiles.Count} file non validi.", LogType.WARN);
}
if (duplicateFiles.Count > 0)
{
_logger.Log($"Trovati {duplicateFiles.Count} file duplicati.", LogType.WARN);
}
_logger.LogDispositivoCheck(LogStatus.COMPLETATO, totalFiles, processedFiles, inseriti, aggiornati, errori, warning);
_logger.Log("Verifica completata.", LogType.INFO);
}
catch (Exception ex)
{
_logger.Log($"Errore durante la verifica dei file: {ex.Message}", LogType.ERROR);
}
finally
{
startButton.Invoke((Action)(() => startButton.Enabled = true));
stopButton.Invoke((Action)(() => stopButton.Enabled = false));
}
}
private async Task<string> ComputeFileHashAsync(string filePath)
{
using (var sha256 = SHA256.Create())
using (var stream = File.OpenRead(filePath))
{
byte[] hashBytes = await Task.Run(() => sha256.ComputeHash(stream));
return BitConverter.ToString(hashBytes).Replace("-", "").ToLowerInvariant();
}
}
}
}