Compare commits
	
		
			15 Commits
		
	
	
		
			f99ca8bb26
			...
			bc42dd542a
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| bc42dd542a | |||
| 836b850f3f | |||
| 944b61a1ac | |||
| 6fbc53fa53 | |||
| b899c4c5b6 | |||
| 2d42842fb2 | |||
| 8aec649781 | |||
| c51e02fa05 | |||
| 132894e924 | |||
| b05ddd5e18 | |||
| 64995434ab | |||
| 5a3becb3b4 | |||
| 846b983caa | |||
| 951068c750 | |||
| 6d2880907b | 
| @@ -10,7 +10,7 @@ indent_style = space | ||||
| tab_width = 4 | ||||
|  | ||||
| # Naming Conventions | ||||
| dotnet_naming_style.pascal_case_style.capitalization = pascal_case | ||||
| dotnet_naming_style.camel_case.capitalization = camel_case | ||||
|  | ||||
| # New line preferences | ||||
| csharp_new_line_before_open_brace = none | ||||
|   | ||||
							
								
								
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @@ -1,3 +1,4 @@ | ||||
| .vscode/ | ||||
| obj/ | ||||
| bin/ | ||||
| Libraries/ | ||||
|   | ||||
							
								
								
									
										12
									
								
								README.md
									
									
									
									
									
								
							
							
						
						
									
										12
									
								
								README.md
									
									
									
									
									
								
							| @@ -7,7 +7,7 @@ Checksums every file under the current directory | ||||
| Clone the project | ||||
|  | ||||
| ```bash | ||||
| git clone http://192.168.0.69:3000/ProfessionalUwU/chksum.git | ||||
| git clone https://gitea.hopeless-cloud.xyz/ProfessionalUwU/chksum.git | ||||
| ``` | ||||
|  | ||||
| Go to the project directory | ||||
| @@ -25,22 +25,22 @@ pacman -S dotnet-runtime dotnet-sdk | ||||
| Build project | ||||
|  | ||||
| ```bash | ||||
| dotnet build chksum.csproj | ||||
| just build | ||||
| ``` | ||||
|  | ||||
| Publish project | ||||
|  | ||||
| ```bash | ||||
| dotnet publish --configuration Release chksum.csproj | ||||
| just publish | ||||
| ``` | ||||
|  | ||||
| Go to the publish folder | ||||
| ```bash | ||||
| cd bin/Release/net7.0/linux-x64/publish | ||||
| cd src/Chksum/bin/Release/net7.0/linux-x64/publish | ||||
| ``` | ||||
|  | ||||
| Run executable | ||||
|  | ||||
| ```bash | ||||
| ./chksum | ||||
| ``` | ||||
| ./Chksum | ||||
| ``` | ||||
							
								
								
									
										111
									
								
								chksum.cs
									
									
									
									
									
								
							
							
						
						
									
										111
									
								
								chksum.cs
									
									
									
									
									
								
							| @@ -1,111 +0,0 @@ | ||||
| // Go into folder | ||||
| // Check if any file is in there | ||||
| // If there is a file. Calculate md5sum > filename.md5 | ||||
| // If there is no file. Repeat | ||||
| public class Chksum { | ||||
|      | ||||
|     // int getDirectoryCount() { | ||||
|     //     int folderCount = Directory.GetDirectories(Directory.GetCurrentDirectory()).Length; // Get folder count in current directory | ||||
|     //     return folderCount; | ||||
|     // } | ||||
|  | ||||
|     private static int getFileCount() { | ||||
|         int fileCount = Directory.GetFiles(Directory.GetCurrentDirectory()).Length; // Get file count in current directory | ||||
|         return fileCount; | ||||
|     } | ||||
|  | ||||
|     // string getParentFolder() { | ||||
|     //     string parentFolder = Directory.GetParent(Directory.GetCurrentDirectory()).ToString(); // Get parent folder of current directory | ||||
|     //     return parentFolder; | ||||
|     // } | ||||
|  | ||||
|     private static string CalculateMD5(string filename) { | ||||
|         using (var md5 = System.Security.Cryptography.MD5.Create()) { | ||||
|             using (var stream = File.OpenRead(filename)) { | ||||
|                 var hash = md5.ComputeHash(stream); | ||||
|                 return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void doTheThing() { | ||||
|         foreach (var directory in Directory.GetDirectories(Directory.GetCurrentDirectory())) { | ||||
|             Directory.SetCurrentDirectory(directory); // Set new root | ||||
|             if (getFileCount() >= 1) { | ||||
|                 DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory()); | ||||
|                 FileInfo[] files = dir.GetFiles(); | ||||
|                 foreach (FileInfo file in files) { | ||||
|                     string fileName = file.Name; | ||||
|                     string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); | ||||
|                     string checksumFile = Directory.GetCurrentDirectory() + "/" + fileNameWithoutExtension + ".md5"; | ||||
|                     File.AppendAllText(checksumFile, CalculateMD5(fileName) + "  " + fileName); | ||||
|                     Console.WriteLine(checksumFile); | ||||
|                 } | ||||
|             } | ||||
|             doTheThing(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private static int getTotalFileCount() { | ||||
|         int totalFileCount = Directory.GetFiles(Directory.GetCurrentDirectory(), "*", SearchOption.AllDirectories).Length; | ||||
|         return totalFileCount - 1; // Remove the program from the totalFileCount | ||||
|     } | ||||
|  | ||||
|     public static void countAllMd5Checksums() { | ||||
|         int totalMD5FileCount = Directory.GetFiles(Directory.GetCurrentDirectory(), "*.md5", SearchOption.AllDirectories).Length; | ||||
|         Console.WriteLine("There are " + totalMD5FileCount + " md5 checksums"); | ||||
|     } | ||||
|  | ||||
|     public static void deleteAllMd5Checksums() { | ||||
|         foreach (var directory in Directory.GetDirectories(Directory.GetCurrentDirectory())) { | ||||
|             Directory.SetCurrentDirectory(directory); // Set new root | ||||
|             if (getFileCount() >= 1) { | ||||
|                 DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory()); | ||||
|                 FileInfo[] files = dir.GetFiles(); | ||||
|                 foreach (FileInfo file in files) { | ||||
|                     string fileName = file.Name; | ||||
|                     string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); | ||||
|                     string checksumFile = Directory.GetCurrentDirectory() + "/" + fileNameWithoutExtension + ".md5"; | ||||
|                     File.Delete(checksumFile); | ||||
|                     Console.WriteLine("Deleted " + checksumFile); | ||||
|                 } | ||||
|             } | ||||
|             deleteAllMd5Checksums(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public static void compareChecksums() { | ||||
|         foreach (var directory in Directory.GetDirectories(Directory.GetCurrentDirectory())) { | ||||
|             Directory.SetCurrentDirectory(directory); // Set new root | ||||
|             if (getFileCount() >= 1) { | ||||
|                 DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory()); | ||||
|                 FileInfo[] files = dir.GetFiles(); | ||||
|                 // files.ToList().ForEach(i => Console.WriteLine(i.ToString())); // Print all files in files array | ||||
|                 foreach (FileInfo file in files) { | ||||
|                     string fileName = file.Name; | ||||
|                     string fileNameWithoutExtension = Path.GetFileNameWithoutExtension(fileName); | ||||
|                     string checksumFile = Directory.GetCurrentDirectory() + "/" + fileNameWithoutExtension + ".md5"; | ||||
|                     string fileMd5Checksum = fileNameWithoutExtension + ".md5"; | ||||
|                     if (File.Exists(fileMd5Checksum)) { | ||||
|                         string newFileChecksum = CalculateMD5(fileName) + "  " + fileName; | ||||
|                         string existingFileChecksum = File.ReadAllText(fileMd5Checksum); | ||||
|                         string newFileName = newFileChecksum.Substring(34); | ||||
|                         string existingFileName = existingFileChecksum.Substring(34); | ||||
|                         if (newFileChecksum.Equals(existingFileChecksum)) { | ||||
|                             Console.WriteLine(newFileName + " and " + existingFileName + " are the same."); | ||||
|                         } else { | ||||
|                             Console.WriteLine(newFileName + " and " + existingFileName + " are not the same."); | ||||
|                             Console.WriteLine("The checksum of " + newFileName + " is " + newFileChecksum); | ||||
|                             Console.WriteLine("The checksum of the already exting file " + existingFileName + " is " + existingFileChecksum); | ||||
|                             // TODO Tell the user to check which file is the correct one | ||||
|                         } | ||||
|                     } else { | ||||
|                         File.AppendAllText(checksumFile, CalculateMD5(fileName) + "  " + fileName); | ||||
|                         Console.WriteLine("Calculated checksum for: " + checksumFile); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             compareChecksums(); | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										31
									
								
								justfile
									
									
									
									
									
								
							
							
						
						
									
										31
									
								
								justfile
									
									
									
									
									
								
							| @@ -1,2 +1,31 @@ | ||||
| default: | ||||
|     @just --list | ||||
|  | ||||
| project_name := `printf '%s\n' "${PWD##*/}"` | ||||
| uppercase_project_name := capitalize(project_name) | ||||
|  | ||||
| setup: | ||||
|     @mkdir src | ||||
|     @dotnet new sln --name src/{{project_name}} | ||||
|     @dotnet new classlib -o  src/{{uppercase_project_name}} | ||||
|     @dotnet new xunit -o src/{{uppercase_project_name}}.Tests | ||||
|     @dotnet sln add src/{{uppercase_project_name}}/{{uppercase_project_name}}.csproj | ||||
|     @dotnet sln add src/{{uppercase_project_name}}.Tests/{{uppercase_project_name}}.Tests.csproj | ||||
|     @dotnet add src/{{uppercase_project_name}}/{{uppercase_project_name}}.csproj reference src/{{uppercase_project_name}}.Tests/{{uppercase_project_name}}.Tests.csproj | ||||
|  | ||||
| run: | ||||
|     @dotnet run | ||||
|  | ||||
| build: | ||||
|     @dotnet build src/{{uppercase_project_name}}/{{uppercase_project_name}}.csproj | ||||
|     @dotnet build src/{{uppercase_project_name}}.Tests/{{uppercase_project_name}}.Tests.csproj | ||||
|  | ||||
| publish: | ||||
|     @dotnet publish --configuration Release chksum.csproj | ||||
|     @dotnet publish --configuration Release src/{{uppercase_project_name}}/{{uppercase_project_name}}.csproj | ||||
|  | ||||
| format: | ||||
|     @dotnet format src/{{uppercase_project_name}} | ||||
|     @dotnet format src/{{uppercase_project_name}}.Tests | ||||
|  | ||||
| test: build | ||||
|     @dotnet test src/{{uppercase_project_name}}.Tests | ||||
|   | ||||
							
								
								
									
										25
									
								
								src/Chksum.Tests/Chksum.Tests.csproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								src/Chksum.Tests/Chksum.Tests.csproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
|  | ||||
|   <PropertyGroup> | ||||
|     <TargetFramework>net7.0</TargetFramework> | ||||
|     <ImplicitUsings>enable</ImplicitUsings> | ||||
|     <Nullable>enable</Nullable> | ||||
|  | ||||
|     <IsPackable>false</IsPackable> | ||||
|   </PropertyGroup> | ||||
|  | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="FluentAssertions" Version="6.11.0" /> | ||||
|     <PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.3.2" /> | ||||
|     <PackageReference Include="xunit" Version="2.4.2" /> | ||||
|     <PackageReference Include="xunit.runner.visualstudio" Version="2.4.5"> | ||||
|       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||
|       <PrivateAssets>all</PrivateAssets> | ||||
|     </PackageReference> | ||||
|     <PackageReference Include="coverlet.collector" Version="3.1.2"> | ||||
|       <IncludeAssets>runtime; build; native; contentfiles; analyzers; buildtransitive</IncludeAssets> | ||||
|       <PrivateAssets>all</PrivateAssets> | ||||
|     </PackageReference> | ||||
|   </ItemGroup> | ||||
|  | ||||
| </Project> | ||||
							
								
								
									
										2
									
								
								src/Chksum.Tests/Usings.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										2
									
								
								src/Chksum.Tests/Usings.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,2 @@ | ||||
| global using Xunit; | ||||
| global using FluentAssertions; | ||||
							
								
								
									
										8
									
								
								src/Chksum.Tests/doTheThingTest.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										8
									
								
								src/Chksum.Tests/doTheThingTest.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,8 @@ | ||||
| namespace Chksum.Tests; | ||||
|  | ||||
| public class doTheThingTest { | ||||
|     [Fact] | ||||
|     public void doTheThing_willNotThrowAnException() { | ||||
|  | ||||
|     } | ||||
| } | ||||
| @@ -1,5 +1,10 @@ | ||||
| <Project Sdk="Microsoft.NET.Sdk"> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <ProjectReference Include="..\Chksum.Tests\Chksum.Tests.csproj" /> | ||||
|     <EmbeddedResource Include="Libraries/libe_sqlite3.so" /> | ||||
|   </ItemGroup> | ||||
| 
 | ||||
|   <PropertyGroup> | ||||
|     <OutputType>Exe</OutputType> | ||||
|     <TargetFramework>net7.0</TargetFramework> | ||||
| @@ -11,4 +16,8 @@ | ||||
|     <Nullable>enable</Nullable> | ||||
|   </PropertyGroup> | ||||
| 
 | ||||
|   <ItemGroup> | ||||
|     <PackageReference Include="Microsoft.Data.Sqlite" Version="7.0.8" /> | ||||
|   </ItemGroup> | ||||
| 
 | ||||
| </Project> | ||||
| @@ -1,4 +1,6 @@ | ||||
| public class Program { | ||||
| using Chksum.Utils; | ||||
| 
 | ||||
| public class Program { | ||||
|     static void Main(string[] args) { | ||||
| 
 | ||||
|         Console.ForegroundColor = ConsoleColor.Red; | ||||
| @@ -6,45 +8,39 @@ | ||||
|             Console.WriteLine("Please specify an option."); | ||||
|             PrintAvailableOptions(); | ||||
|             return; | ||||
|         } else if (args.Length > 1) { | ||||
|         } else if (args.Length > 1 && args[0] != "compareDatabases") { | ||||
|             Console.WriteLine("Too many options."); | ||||
|             return; | ||||
|         } | ||||
| 
 | ||||
|         ChksumUtils utils = new ChksumUtils(); | ||||
| 
 | ||||
|         utils.getBaseDir(); | ||||
| 
 | ||||
|         utils.ExtractEmbeddedLibrary(); | ||||
| 
 | ||||
|         Console.ForegroundColor = ConsoleColor.Green; | ||||
|         switch (args[0]) { | ||||
|             case "checksum": | ||||
|                 Console.WriteLine("Starting the checksum process."); | ||||
|                 Console.ResetColor(); | ||||
| 
 | ||||
|                 Chksum.doTheThing(); | ||||
|                 utils.doTheThing(); | ||||
| 
 | ||||
|                 Console.ForegroundColor = ConsoleColor.Green; | ||||
|                 Console.WriteLine("Checksum process finished"); | ||||
|                 break; | ||||
|             case "countmd5": | ||||
|                 Console.WriteLine("Counting md5 checksum files."); | ||||
|             case "compareDatabases": | ||||
|                 Console.ResetColor(); | ||||
| 
 | ||||
|                 Chksum.countAllMd5Checksums(); | ||||
| 
 | ||||
|                 Console.ForegroundColor = ConsoleColor.Green; | ||||
|                 Console.WriteLine("Finished counting all md5 checksum files."); | ||||
|                 utils.compareDatabases(args[1]); | ||||
|                 break; | ||||
|             case "deletemd5": | ||||
|                 Console.WriteLine("Deleting all md5 checksum files."); | ||||
|                 Console.ResetColor(); | ||||
| 
 | ||||
|                 Chksum.deleteAllMd5Checksums(); | ||||
| 
 | ||||
|                 Console.ForegroundColor = ConsoleColor.Green; | ||||
|                 Console.WriteLine("Deleted all md5 checksum files."); | ||||
|             case "createDB": | ||||
|                 utils.initializeDB(); | ||||
|                 break; | ||||
|             case "compareChecksums": | ||||
|                 Console.WriteLine("Comparing all md5 checksum files. If there is none, creating one."); | ||||
|             case "checkIfFileWasDeleted": | ||||
|                 Console.ResetColor(); | ||||
| 
 | ||||
|                 Chksum.compareChecksums(); | ||||
|                 utils.checkIfFileWasDeleted(); | ||||
|                 break; | ||||
|             case "help": | ||||
|                 PrintAvailableOptions(); | ||||
| @@ -55,20 +51,21 @@ | ||||
|                 PrintAvailableOptions(); | ||||
|                 break; | ||||
|         } | ||||
| 
 | ||||
|         utils.cleanup(); | ||||
|     } | ||||
| 
 | ||||
|     static void PrintAvailableOptions() { | ||||
|         String[] options = { | ||||
|             "checksum", | ||||
|             "countmd5", | ||||
|             "deletemd5", | ||||
|             "compareChecksums", | ||||
|             "createDB", | ||||
|             "checkIfFileWasDeleted", | ||||
|             "help" | ||||
|         }; | ||||
| 
 | ||||
|         Console.ResetColor(); | ||||
|         Console.WriteLine("usage: chksum [option]"); | ||||
|         Console.WriteLine("Here is a list of all available options:"); | ||||
|         Console.WriteLine("usage: chksum [option] \nHere is a list of all available options:"); | ||||
|         foreach (String option in options) { | ||||
|             Console.WriteLine("\t" + option); | ||||
|         } | ||||
							
								
								
									
										268
									
								
								src/Chksum/chksum.cs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										268
									
								
								src/Chksum/chksum.cs
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,268 @@ | ||||
| using System.Reflection; | ||||
| using Microsoft.Data.Sqlite; | ||||
| namespace Chksum.Utils; | ||||
| public class ChksumUtils { | ||||
|  | ||||
|     private int getFileCount() { | ||||
|         int fileCount = Directory.GetFiles(Directory.GetCurrentDirectory()).Length; // Get file count in current directory | ||||
|         return fileCount; | ||||
|     } | ||||
|  | ||||
|     public string DatabaseRoot { get; set; } = string.Empty; | ||||
|     public void getBaseDir() { | ||||
|         DatabaseRoot = AppDomain.CurrentDomain.BaseDirectory; | ||||
|     } | ||||
|  | ||||
|     public string libraryPath { get; set; } = string.Empty; | ||||
|     public void ExtractEmbeddedLibrary() { | ||||
|         libraryPath = Path.Combine(DatabaseRoot, "libe_sqlite3.so"); | ||||
|  | ||||
|         using (Stream? resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("Chksum.Libraries.libe_sqlite3.so")) { | ||||
|             if (resourceStream != null) { | ||||
|                 byte[] buffer = new byte[resourceStream.Length]; | ||||
|                 resourceStream.Read(buffer, 0, buffer.Length); | ||||
|                 File.WriteAllBytes(libraryPath, buffer); | ||||
|             } else { | ||||
|                 throw new Exception(libraryPath + " could not be loaded"); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void initializeDB() { | ||||
|         if (File.Exists("chksum.db")) { | ||||
|             return; | ||||
|         } | ||||
|  | ||||
|         using (var connection = new SqliteConnection("Data Source=chksum.db")) { | ||||
|             connection.Open(); | ||||
|  | ||||
|             var command = connection.CreateCommand(); | ||||
|             command.CommandText = | ||||
|             @" | ||||
|                 CREATE TABLE file ( | ||||
|                 filehash TEXT NOT NULL PRIMARY KEY, | ||||
|                 filename TEXT NOT NULL, | ||||
|                 pathtofile TEXT NOT NULL, | ||||
|                 artist TEXT, | ||||
|                 playbacklength INTEGER | ||||
|                 ); | ||||
|             "; | ||||
|             command.ExecuteNonQuery(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void cleanDB() { | ||||
|         using (var connection = new SqliteConnection("Data Source=" + DatabaseRoot + "chksum.db")) { | ||||
|             var command = connection.CreateCommand(); | ||||
|             command.CommandText = | ||||
|             @" | ||||
|                 vacuum; | ||||
|             "; | ||||
|             command.ExecuteNonQuery(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private string CalculateMD5(string filename) { | ||||
|         using (var md5 = System.Security.Cryptography.MD5.Create()) { | ||||
|             using (var stream = File.OpenRead(filename)) { | ||||
|                 var hash = md5.ComputeHash(stream); | ||||
|                 return BitConverter.ToString(hash).Replace("-", "").ToLowerInvariant(); | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void doTheThing() { | ||||
|         foreach (var directory in Directory.GetDirectories(Directory.GetCurrentDirectory()))  | ||||
|         using (var connection = new SqliteConnection("Data Source=" + DatabaseRoot + "chksum.db;Mode=ReadWrite")) { | ||||
|             Directory.SetCurrentDirectory(directory); // Set new root | ||||
|             if (getFileCount() >= 1) { | ||||
|                 DirectoryInfo dir = new DirectoryInfo(Directory.GetCurrentDirectory()); | ||||
|                 FileInfo[] files = dir.GetFiles(); | ||||
|                 foreach (FileInfo file in files) { | ||||
|                     string fileName = file.Name; | ||||
|                     string absolutePathToFile = Path.GetFullPath(fileName); | ||||
|                     string pathToFile = Path.GetRelativePath(DatabaseRoot, absolutePathToFile); | ||||
|                     string fileHash = CalculateMD5(fileName); | ||||
|  | ||||
|                     if (checkIfFileMovedAndUpdatePathToFile(fileHash, fileName, pathToFile) == false && checkIfFileAlreadyExistsInDatabase(fileHash, fileName) == false) { | ||||
|                         connection.Open(); | ||||
|  | ||||
|                         var command = connection.CreateCommand(); | ||||
|                         command.CommandText = | ||||
|                         @" | ||||
|                             INSERT INTO file (filehash, filename, pathtofile) | ||||
|                             VALUES ($filehash, $filename, $pathtofile) | ||||
|                         "; | ||||
|                         command.Parameters.AddWithValue("$filehash", fileHash); | ||||
|                         command.Parameters.AddWithValue("$filename", fileName); | ||||
|                         command.Parameters.AddWithValue("$pathtofile", pathToFile); | ||||
|                         command.ExecuteNonQuery(); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|             doTheThing(); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private bool checkIfFileAlreadyExistsInDatabase(string fileHash, string pathToFile) { | ||||
|         string filehash = string.Empty; | ||||
|         string pathtofile = string.Empty; | ||||
|         bool doesExist = false; | ||||
|  | ||||
|         using (var connection = new SqliteConnection("Data Source=" + DatabaseRoot + "chksum.db;Mode=ReadOnly")) { | ||||
|             connection.Open(); | ||||
|  | ||||
|             var command = connection.CreateCommand(); | ||||
|             command.CommandText = | ||||
|             @" | ||||
|                 SELECT filehash, pathtofile FROM file WHERE filehash = $filehash | ||||
|             "; | ||||
|             command.Parameters.AddWithValue("$filehash", fileHash); | ||||
|  | ||||
|             using (var reader = command.ExecuteReader()) { | ||||
|                 while (reader.Read()) { | ||||
|                     filehash = reader.GetString(0); | ||||
|                     pathtofile = reader.GetString(1); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         if (fileHash == filehash) { | ||||
|             doesExist = true; | ||||
|         } | ||||
|         return doesExist; | ||||
|     } | ||||
|  | ||||
|     private bool checkIfFileMovedAndUpdatePathToFile(string fileHash, string fileName, string pathToFile) { | ||||
|         string pathtofile = string.Empty; | ||||
|         bool wasMoved = false; | ||||
|  | ||||
|         using (var connection = new SqliteConnection("Data Source=" + DatabaseRoot + "chksum.db;Mode=ReadWrite")) { | ||||
|             connection.Open(); | ||||
|  | ||||
|             var command = connection.CreateCommand(); | ||||
|             command.CommandText = | ||||
|             @" | ||||
|                 SELECT pathtofile FROM file WHERE filehash = $filehash | ||||
|             "; | ||||
|             command.Parameters.AddWithValue("$filehash", fileHash); | ||||
|  | ||||
|             using (var reader = command.ExecuteReader()) { | ||||
|                 while (reader.Read()) { | ||||
|                     pathtofile = reader.GetString(0); | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|             if (pathToFile != pathtofile && pathtofile != "") { | ||||
|                 var command2 = connection.CreateCommand(); | ||||
|                 command2.CommandText = | ||||
|                 @" | ||||
|                     UPDATE file | ||||
|                     SET pathtofile = $newpathtofile | ||||
|                     WHERE filehash = $filehash | ||||
|                 "; | ||||
|                 command2.Parameters.AddWithValue("$newpathtofile", pathToFile); | ||||
|                 command2.Parameters.AddWithValue("$filehash", fileHash); | ||||
|                 command2.ExecuteNonQuery(); | ||||
|  | ||||
|                 Console.WriteLine("File moved:"); | ||||
|                 Console.WriteLine($"\tfrom\t{pathToFile}"); | ||||
|                 Console.WriteLine($"\tto  \t{pathtofile}\n"); | ||||
|                 wasMoved = true; | ||||
|             } | ||||
|             return wasMoved; | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void checkIfFileWasDeleted() { | ||||
|         string pathToFile = string.Empty; | ||||
|  | ||||
|         using (var connection = new SqliteConnection("Data Source=" + DatabaseRoot + "chksum.db;Mode=ReadWrite")) { | ||||
|             connection.Open(); | ||||
|  | ||||
|             var selectCommand = connection.CreateCommand(); | ||||
|             selectCommand.CommandText = | ||||
|             @" | ||||
|                 Select pathtofile FROM file | ||||
|             "; | ||||
|  | ||||
|             using (var reader = selectCommand.ExecuteReader()) { | ||||
|                 while (reader.Read()) { | ||||
|                     pathToFile = reader.GetString(0); | ||||
|                      | ||||
|                     if (!File.Exists(pathToFile)) { | ||||
|                         var deleteCommand = connection.CreateCommand(); | ||||
|                         deleteCommand.CommandText = | ||||
|                         @" | ||||
|                             DELETE FROM file | ||||
|                             WHERE pathtofile = $pathtofile | ||||
|                         "; | ||||
|                         deleteCommand.Parameters.AddWithValue("$pathtofile", pathToFile); | ||||
|                         deleteCommand.ExecuteNonQuery(); | ||||
|  | ||||
|                         Console.WriteLine("File deleted:"); | ||||
|                         Console.WriteLine($"\t{pathToFile}\n"); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     private List<string> getFilehashesFromDatabase(string connectionString) { | ||||
|         List<string> filehashesFromDatabase = new List<string>(); | ||||
|  | ||||
|         using (var connection = new SqliteConnection(connectionString)) { | ||||
|             string filehash = string.Empty; | ||||
|              | ||||
|             connection.Open(); | ||||
|  | ||||
|             var selectCommand = connection.CreateCommand(); | ||||
|             selectCommand.CommandText = | ||||
|             @" | ||||
|                 Select filehash FROM file | ||||
|             "; | ||||
|  | ||||
|             using (var reader = selectCommand.ExecuteReader()) { | ||||
|                 while (reader.Read()) { | ||||
|                     filehash = reader.GetString(0); | ||||
|                     filehashesFromDatabase.Add(filehash); | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|  | ||||
|         return filehashesFromDatabase; | ||||
|     } | ||||
|  | ||||
|     public void compareDatabases(string filePathToOtherDatabase) { | ||||
|         List<string> filesThatDoNotExistsInTheRemote = getFilehashesFromDatabase("Data Source=" + DatabaseRoot + "chksum.db;Mode=ReadOnly").Except(getFilehashesFromDatabase("Data Source=" + filePathToOtherDatabase + ";Mode=ReadOnly")).ToList(); | ||||
|         //List<string> filesThatDoNotExistsInTheOrigin = filehashesOfRemoteDatabase.Except(filehashesOfOriginDatabase).ToList(); | ||||
|  | ||||
|         foreach (string file in filesThatDoNotExistsInTheRemote) { | ||||
|             using (var connection = new SqliteConnection("Data Source=" + DatabaseRoot + "chksum.db;Mode=ReadOnly")) { | ||||
|                 string filename = string.Empty; | ||||
|                  | ||||
|                 connection.Open(); | ||||
|  | ||||
|                 var selectCommand = connection.CreateCommand(); | ||||
|                 selectCommand.CommandText = | ||||
|                 @" | ||||
|                     Select filename FROM file WHERE filehash = $filehash | ||||
|                 "; | ||||
|                 selectCommand.Parameters.AddWithValue("$filehash", file); | ||||
|  | ||||
|                 using (var reader = selectCommand.ExecuteReader()) { | ||||
|                     while (reader.Read()) { | ||||
|                         filename = reader.GetString(0); | ||||
|                          | ||||
|                         Console.WriteLine("File not found in remote:"); | ||||
|                         Console.WriteLine($"\t{filename}\n"); | ||||
|                     } | ||||
|                 } | ||||
|             } | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     public void cleanup() { | ||||
|         File.Delete(libraryPath); | ||||
|     } | ||||
| } | ||||
							
								
								
									
										28
									
								
								src/chksum.sln
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								src/chksum.sln
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | ||||
|  | ||||
| Microsoft Visual Studio Solution File, Format Version 12.00 | ||||
| # Visual Studio Version 17 | ||||
| VisualStudioVersion = 17.0.31903.59 | ||||
| MinimumVisualStudioVersion = 10.0.40219.1 | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chksum", "Chksum\Chksum.csproj", "{BBC56294-03CF-42E0-A838-75AF41EEE32B}" | ||||
| EndProject | ||||
| Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Chksum.Tests", "Chksum.Tests\Chksum.Tests.csproj", "{239727BC-7124-4985-A6F3-2700295AA06F}" | ||||
| EndProject | ||||
| Global | ||||
| 	GlobalSection(SolutionConfigurationPlatforms) = preSolution | ||||
| 		Debug|Any CPU = Debug|Any CPU | ||||
| 		Release|Any CPU = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(SolutionProperties) = preSolution | ||||
| 		HideSolutionNode = FALSE | ||||
| 	EndGlobalSection | ||||
| 	GlobalSection(ProjectConfigurationPlatforms) = postSolution | ||||
| 		{BBC56294-03CF-42E0-A838-75AF41EEE32B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{BBC56294-03CF-42E0-A838-75AF41EEE32B}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{BBC56294-03CF-42E0-A838-75AF41EEE32B}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{BBC56294-03CF-42E0-A838-75AF41EEE32B}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 		{239727BC-7124-4985-A6F3-2700295AA06F}.Debug|Any CPU.ActiveCfg = Debug|Any CPU | ||||
| 		{239727BC-7124-4985-A6F3-2700295AA06F}.Debug|Any CPU.Build.0 = Debug|Any CPU | ||||
| 		{239727BC-7124-4985-A6F3-2700295AA06F}.Release|Any CPU.ActiveCfg = Release|Any CPU | ||||
| 		{239727BC-7124-4985-A6F3-2700295AA06F}.Release|Any CPU.Build.0 = Release|Any CPU | ||||
| 	EndGlobalSection | ||||
| EndGlobal | ||||
		Reference in New Issue
	
	Block a user