192 lines
6.1 KiB
C#
192 lines
6.1 KiB
C#
using BS.SharedLauncher.DataContract;
|
|
using BS.SharedLauncher.Enums;
|
|
using BS.SharedLauncher.Extensions;
|
|
using BS.SharedLauncher.Information;
|
|
using BS.SharedLauncher.Update;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.IO;
|
|
using System.IO.Compression;
|
|
using System.Linq;
|
|
using System.Text;
|
|
using System.Threading;
|
|
using System.Threading.Tasks;
|
|
using System.Windows;
|
|
|
|
namespace BS.SharedLauncher.Logic
|
|
{
|
|
public static class FileController
|
|
{
|
|
private static string DotBeWoInfo => BeWoPathFileConfig.DotBeWoInfo;
|
|
|
|
public static List<UpdateFileDC> GetDownloadedFiles(string downloadFolder)
|
|
{
|
|
return GetPlanerFiles(downloadFolder, true, null);
|
|
}
|
|
public static UpdatePlanDC GetApplyPackage(string applyFolder)
|
|
{
|
|
TryGetPackageInfo(applyFolder, out var package);
|
|
|
|
if (package == null)
|
|
package = new UpdatePlanDC();
|
|
|
|
package.Files = GetPlanerFiles(applyFolder, true, null);
|
|
|
|
return package;
|
|
}
|
|
public static UpdatePlanDC LoadPackageInfo(string filepath)
|
|
{
|
|
filepath = filepath.WithInfoExtension();
|
|
|
|
var xml = File.ReadAllText(filepath);
|
|
var obj = XmlConverter.Deserialize<UpdatePlanDC>(xml);
|
|
|
|
return obj;
|
|
}
|
|
public static bool TryGetPackageInfo(string filepath, out UpdatePlanDC planerPackageInfoDC)
|
|
{
|
|
planerPackageInfoDC = null;
|
|
|
|
try
|
|
{
|
|
planerPackageInfoDC = LoadPackageInfo(filepath);
|
|
}
|
|
catch (Exception)
|
|
{
|
|
return false;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
#region file
|
|
public static void SaveFile(string path, byte[] data)
|
|
{
|
|
GenericTextLogger.Post($"Save File: {path}");
|
|
File.WriteAllBytes(path, data);
|
|
}
|
|
public static void CopyFile(string source, string destination)
|
|
{
|
|
GenericTextLogger.Post($"Copy File: {source} -> {destination}");
|
|
File.Copy(source, destination, true);
|
|
}
|
|
public static void DeleteFile(string source)
|
|
{
|
|
GenericTextLogger.Post($"Delete File: {source}");
|
|
File.Delete(source);
|
|
}
|
|
#endregion
|
|
|
|
#region info
|
|
public static void SaveInfo<T>(string path, T t)
|
|
where T : class
|
|
{
|
|
File.WriteAllText(path.WithInfoExtension(), XmlConverter.Serialize<T>(t));
|
|
GenericTextLogger.Post($"Info Save: {path}");
|
|
}
|
|
public static void DeleteInfo(string path)
|
|
{
|
|
File.Delete(path.WithInfoExtension());
|
|
GenericTextLogger.Post($"Info delete: {path}");
|
|
}
|
|
public static string WithInfoExtension(this string path)
|
|
{
|
|
if (path.EndsWith(DotBeWoInfo))
|
|
return path;
|
|
|
|
return path + DotBeWoInfo;
|
|
}
|
|
#endregion
|
|
|
|
public static void DeleteEmptyDirectories(string path)
|
|
{
|
|
// Witzige Sache: Generiert mit chat.openai.com/chat
|
|
// Recursive function to delete empty directories
|
|
// Get all subdirectories in the specified path
|
|
string[] subdirectories = Directory.GetDirectories(path);
|
|
|
|
// Loop through each subdirectory
|
|
foreach (string subdirectory in subdirectories)
|
|
{
|
|
// Call the recursive function to delete empty directories in the subdirectory
|
|
DeleteEmptyDirectories(subdirectory);
|
|
|
|
// Check if the subdirectory is empty
|
|
if (IsDirectoryEmpty(subdirectory))
|
|
{
|
|
// If the subdirectory is empty, delete it
|
|
Directory.Delete(subdirectory);
|
|
GenericTextLogger.Post($"Deleted empty directory: {subdirectory}");
|
|
}
|
|
}
|
|
}
|
|
|
|
public static List<UpdateFileDC> GetPlanerFiles(string path, bool hash, Func<UpdateFileDC, bool> skipFile)
|
|
{
|
|
var files = new List<UpdateFileDC>();
|
|
|
|
// Sollte der Path ohne / enden, wird der unterordner mit angegeben
|
|
// Deshalb manuell hinzufügen, falls nicht vorhanden
|
|
|
|
if (!path.EndsWith(Path.DirectorySeparatorChar.ToString()))
|
|
path += Path.DirectorySeparatorChar;
|
|
|
|
GetPlanerFilesRecursive(new DirectoryInfo(path), path, ref files, hash, skipFile);
|
|
|
|
return files;
|
|
}
|
|
public static void GetPlanerFilesRecursive(DirectoryInfo directoryInfo, string relativeTo, ref List<UpdateFileDC> files, bool load_hash, Func<UpdateFileDC, bool> skipFile)
|
|
{
|
|
foreach (var item in directoryInfo.GetDirectories())
|
|
{
|
|
GetPlanerFilesRecursive(item, relativeTo, ref files, load_hash, skipFile);
|
|
}
|
|
|
|
foreach (var item in directoryInfo.GetFiles())
|
|
{
|
|
var file = new UpdateFileDC(item, relativeTo);
|
|
|
|
if (file.IgnoreFile())
|
|
continue;
|
|
|
|
if (skipFile is object && skipFile(file))
|
|
continue;
|
|
|
|
if (load_hash)
|
|
file.LoadHash();
|
|
|
|
files.Add(file);
|
|
}
|
|
}
|
|
|
|
public static bool IsDirectoryWritable(string dirPath, bool throwIfFails = false)
|
|
{
|
|
try
|
|
{
|
|
Directory.CreateDirectory(dirPath);
|
|
using (FileStream fs = File.Create(
|
|
Path.Combine(
|
|
dirPath,
|
|
BeWoPathFileConfig.TestForPermissionFile
|
|
),
|
|
1,
|
|
FileOptions.DeleteOnClose)
|
|
)
|
|
{ }
|
|
return true;
|
|
}
|
|
catch (Exception e)
|
|
{
|
|
if (throwIfFails)
|
|
throw;
|
|
else
|
|
return false;
|
|
}
|
|
}
|
|
private static bool IsDirectoryEmpty(string path)
|
|
{
|
|
return !Directory.EnumerateFileSystemEntries(path).Any();
|
|
}
|
|
}
|
|
}
|