71 lines
3.2 KiB
C#
71 lines
3.2 KiB
C#
#region Using Statements
|
|
|
|
using System;
|
|
using System.IO;
|
|
|
|
#endregion
|
|
|
|
namespace OneDriveArchiver
|
|
{
|
|
public static class IoHelper
|
|
{
|
|
/// <summary>
|
|
/// Archives a one drive file. It takes the file creation date and month,
|
|
/// creates the necessary folder structure (if necessary) i.e. Year\Month and
|
|
/// moves the file to the (new) target folder. The Sync engine of OneDrive then
|
|
/// will sync the changes being made back to the cloud. Base Path is the path where
|
|
/// the file was found. So the subfolder will start in the same directory.
|
|
/// </summary>
|
|
/// <param name="appName"></param>
|
|
/// <param name="filename">Filename</param>
|
|
public static void ArchiveOneDriveFile(string appName, string targetPath, string filename)
|
|
{
|
|
try
|
|
{
|
|
if (string.IsNullOrEmpty(filename)) throw new ArgumentException("filename cannot be null.");
|
|
|
|
// do a check if the file is empty...
|
|
var fi = new FileInfo(filename);
|
|
if (fi.Length == 0)
|
|
{
|
|
Console.WriteLine($"OneDriveArchiver: Deleting file {filename} as it has zero bytes content.");
|
|
File.Delete(filename);
|
|
return;
|
|
}
|
|
|
|
var dateModified = File.GetLastWriteTime(filename);
|
|
var fileMonth = dateModified.Month.ToString("D2");
|
|
var fileYear = dateModified.Year.ToString();
|
|
var fileNameWithOutPath = Path.GetFileName(filename);
|
|
|
|
// check if we have to create either year or month folder...
|
|
// start with parent year folder...
|
|
var fullYearFolderPath = Path.Combine(targetPath ?? throw new InvalidOperationException(), fileYear);
|
|
var fullMonthFolderPath = Path.Combine(Path.Combine(targetPath, fileYear), fileMonth);
|
|
|
|
// create the directories if not existing...
|
|
if (!Directory.Exists(fullYearFolderPath)) Directory.CreateDirectory(fullYearFolderPath);
|
|
if (!Directory.Exists(fullMonthFolderPath)) Directory.CreateDirectory(fullMonthFolderPath);
|
|
|
|
var newFullFileName = Path.Combine(fullMonthFolderPath, fileNameWithOutPath);
|
|
|
|
// check if the file at the designated new archive location exists. If so, remove the existing file
|
|
// and replace it with the new copy.
|
|
if (File.Exists(newFullFileName))
|
|
{
|
|
Console.WriteLine($"{appName}: archive file exists at designated folder. Removing the old file for copying the new one instead.");
|
|
File.Delete(newFullFileName);
|
|
}
|
|
|
|
// then move the file...
|
|
File.Move(filename, newFullFileName);
|
|
Console.WriteLine($"Moved onedrive file to {newFullFileName} successfully.");
|
|
}
|
|
catch (Exception ex)
|
|
{
|
|
Console.WriteLine(
|
|
$"Exception while backing up OneDrive file. Message = {ex.Message}, Stacktrace = {ex.StackTrace}");
|
|
}
|
|
}
|
|
}
|
|
} |