1
0
mirror of https://bitbucket.org/FuketsuBaka/clearcache1c.git synced 2024-11-01 04:06:53 +00:00
clearcache1c/ClearCache1C/Form1.cs

423 lines
17 KiB
C#
Raw Normal View History

2018-11-17 22:30:51 +00:00
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
// Using
using System.IO;
namespace ClearCache1C
{
public partial class FormMain : Form
{
public FormMain()
{
StartPosition = FormStartPosition.CenterScreen;
InitializeComponent();
}
// ******************* Classes *******************
public class BasesListItem
{
public string Name { get; set; }
public string Path { get; set; }
public string Id { get; set; }
public bool FolderExists { get; set; }
public float FolderSize { get; set; }
public float CacheSize { get; set; }
public List<string> FolderPaths { get; set; }
public List<string> CachePaths { get; set; }
public BasesListItem(string s_name, string s_path, string s_id,
bool s_folder_exists,
float s_folder_size, float s_cache_size,
List<string> s_folder_paths, List<string> s_cache_paths)
{
Name = s_name;
Path = s_path;
Id = s_id;
FolderExists = s_folder_exists;
FolderSize = s_folder_size;
CacheSize = s_cache_size;
FolderPaths = s_folder_paths;
CachePaths = s_cache_paths;
}
public override string ToString() {
string f_size = String.Format("{0,3}", CacheSize.ToString("0"));
return (CacheSize > 0 ? "[" + f_size + " Mb] ": "[------] ")
+ Name;
}
}
// ******************* Events *******************
private void FormMain_Load(object sender, EventArgs e)
{
RefreshListBases();
ToggleInfoView();
//MaximizeBox = false;
//MinimizeBox = false;
}
// ****** LIST CONTROL BUTTONS
private void ButtonSmartSelect_Click(object sender, EventArgs e)
{
ModListBases(true, true);
}
private void ButtonSelectAll_Click(object sender, EventArgs e)
{
ModListBases(true, false);
}
private void ButtonRemoveSelection_Click(object sender, EventArgs e)
{
ModListBases(false, false);
}
private void ButtonExpand_Click(object sender, EventArgs e)
{
ToggleInfoView();
}
private void ToggleInfoView()
{
if (Size.Width != 870) // is collapsed
{
Size = new Size(870, Size.Height);
btnExpand.Text = "<\r\n<\r\n<";
InfoBox.Visible = true;
ShowSelectedInfo();
}
else
{
int calc_width = btnExpand.Location.X + btnExpand.Size.Width + 22;
Size = new Size(calc_width, Size.Height);
btnExpand.Text = ">\r\n>\r\n>";
InfoBox.Visible = false;
}
}
// ****** MAIN BUTTONS
private void ButtonClearCache_Click(object sender, EventArgs e)
{
if (ListBases.CheckedItems.Count == 0)
{
MessageBox.Show("Ничего не выбрано.", "Meh...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
ClearFolders(false);
RefreshListBases();
ShowSelectedInfo();
}
private void ButtonPurgeAll_Click(object sender, EventArgs e)
{
if (ListBases.CheckedItems.Count == 0)
{
MessageBox.Show("Ничего не выбрано.", "Meh...", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
return;
}
DialogResult dialogResult = MessageBox.Show("Это удалит все локальные настройки пользователя в выбранных базах. \r\nВы уверены, что хотите этого?", "Внимание!", MessageBoxButtons.YesNo, MessageBoxIcon.Warning);
if (dialogResult == DialogResult.Yes)
{
ClearFolders(true);
RefreshListBases();
ShowSelectedInfo();
}
}
// ****** FOR DEBUG
private void ListBases_SelectedIndexChanged(object sender, EventArgs e)
{
ShowSelectedInfo();
}
// ******************* MAIN *******************
private void ClearFolders(bool purge)
{
CheckedListBox.CheckedItemCollection items = ListBases.CheckedItems;
int successfully_deleted = 0;
int errors_on_delete = 0;
float total_size_deleted = 0.0f;
List<string> list_success = new List<string>();
List<string> list_error = new List<string>();
List<string> list_exceptions = new List<string>();
for (int i = 0; i < items.Count; i++)
{
BasesListItem base_item = items[i] as BasesListItem;
(bool is_error, float deleted_size, List<string> exceptions) = DeleteFoldersContent(purge ? base_item.FolderPaths : base_item.CachePaths);
if (!is_error)
{
successfully_deleted++;
list_success.Add(base_item.Name);
}
else
{
errors_on_delete++;
list_error.Add(base_item.Name);
list_exceptions.AddRange(exceptions);
}
total_size_deleted += deleted_size;
}
ShowResults(successfully_deleted, errors_on_delete, total_size_deleted, list_success, list_error, list_exceptions);
}
private void ShowResults(int successfully_deleted, int errors_on_delete, float total_size_deleted,
List<string> list_success, List<string> list_error, List<string> list_exceptions)
{
FormResult resultForm = new FormResult();
resultForm.SetInfoResult(successfully_deleted, errors_on_delete, total_size_deleted,
list_success, list_error, list_exceptions);
resultForm.ShowDialog();
}
private (bool is_error, float deleted_size, List<string> exceptions) DeleteFoldersContent(List<string> ListPaths)
{
bool is_error = false;
float deleted_size = 0.0f;
List<string> exceptions = new List<string>();
foreach (string folder_path in ListPaths)
{
long folder_size = DirSize(new DirectoryInfo(folder_path));
try
{
Directory.Delete(folder_path, true);
deleted_size += folder_size;
}
catch (Exception e)
{
is_error = true;
exceptions.Add(e.ToString());
}
}
deleted_size = deleted_size / 1024 / 1024;
return (is_error, deleted_size, exceptions);
}
// ******************* Added functions *******************
private void ShowSelectedInfo()
{
if (!InfoBox.Visible) { return; }
InfoBox.ResetText();
BasesListItem curItem = ListBases.SelectedItem as BasesListItem;
if (curItem is null) { return; }
/*
Console.WriteLine("Name: " + curItem.Name);
Console.WriteLine("ID: " + curItem.Id);
Console.WriteLine("Connect string: " + curItem.Path);
Console.WriteLine("Cache exists: " + curItem.FolderExists);
Console.WriteLine("Size total: " + curItem.FolderSize.ToString("0.00"));
Console.WriteLine("Size cache: " + curItem.CacheSize.ToString("0.00"));
Console.WriteLine("Root Folders: " + curItem.FolderPaths.Count);
Console.WriteLine("Cache Folders: " + curItem.CachePaths.Count);
*/
InfoBox.AppendText("--- Информация о базе ---");
InfoBox.AppendText("\r\nИмя: " + curItem.Name);
InfoBox.AppendText("\r\nID: " + curItem.Id);
InfoBox.AppendText("\r\nСтрока подключения: " + curItem.Path);
InfoBox.AppendText("\r\n");
InfoBox.AppendText("\r\nКэш существует: " + ((curItem.FolderExists) ? "Да" : "Нет"));
InfoBox.AppendText("\r\nРазмер кэша: " + curItem.CacheSize.ToString("0.00") + " Mb");
InfoBox.AppendText("\r\nРазмер всего: " + curItem.FolderSize.ToString("0.00") + " Mb");
InfoBox.AppendText("\r\n");
InfoBox.AppendText("\r\nКорневые каталоги: ");
foreach (string s in curItem.FolderPaths)
{
InfoBox.AppendText("\r\n > " + s);
}
InfoBox.AppendText("\r\n");
InfoBox.AppendText("\r\nКаталоги кэша: ");
foreach (string s in curItem.CachePaths)
{
InfoBox.AppendText("\r\n > " + s);
}
InfoBox.AppendText("\r\n");
}
private void ModListBases(bool isChecked, bool onlyWithCache)
{
for (int i = 0; i < ListBases.Items.Count; i++)
{
if (onlyWithCache)
{
if ((ListBases.Items[i] as BasesListItem).CacheSize > 0)
{
ListBases.SetItemChecked(i, true);
}
else
{
ListBases.SetItemChecked(i, false);
}
}
else
{
ListBases.SetItemChecked(i, isChecked);
}
}
}
private void RefreshListBases()
{
this.ListBases.Items.Clear();
string base_path = @"%appdata%\1C\1CEStart\ibases.v8i";
string[] lines = ReadFileContent(base_path);
if (lines == null)
{
MessageBox.Show("Can't find ibases.v8i file in provided location: " + base_path, "Error reading file!",
MessageBoxButtons.OK, MessageBoxIcon.Error);
return;
}
var bases_dict = GetBasesDictionary(lines);
foreach (string key in bases_dict.Keys)
{
var value = bases_dict[key];
(bool s_folder_exists,
float s_folder_size, float s_cache_size,
List<string> s_folder_paths, List<string> s_cache_paths) = GetLocalFolderInfo(key);
ListBases.Items.Add(new BasesListItem(value.Name, value.Path, key,
s_folder_exists,
s_folder_size, s_cache_size,
s_folder_paths, s_cache_paths), false);
}
}
private (bool s_folder_exists,
float s_folder_size, float s_cache_size,
List<string> s_folder_paths, List<string> s_cache_paths) GetLocalFolderInfo(string key)
{
// Local path of cache is:
// %APPDATA%\1C\1cv8\$Id
// %LOCALAPPDATA%\1C\1cv8\$Id
// var cache_folders = ("Config", "ConfigSave", "SICache", "vrs-cache");
string base_path_local = @"%LOCALAPPDATA%\1C\1cv8\" + key;
string base_path_roaming = @"%APPDATA%\1C\1cv8\" + key;
base_path_local = Environment.ExpandEnvironmentVariables(base_path_local);
base_path_roaming = Environment.ExpandEnvironmentVariables(base_path_roaming);
float s_folder_size = 0.0f;
float s_cache_size = 0.0f;
List<string> s_folder_paths = new List<string>();
List<string> s_cache_paths = new List<string>();
bool s_folder_exists = (Directory.Exists(base_path_local) || Directory.Exists(base_path_roaming)) ? true : false;
if (s_folder_exists)
{
s_cache_paths = GetFoldersById(base_path_local, base_path_roaming);
if (s_cache_paths.Count > 0)
{
foreach (string s in s_cache_paths)
{
s_cache_size += DirSize(new DirectoryInfo(s));
}
}
if (Directory.Exists(base_path_local))
{
s_folder_size += DirSize(new DirectoryInfo(base_path_local));
s_folder_paths.Add(base_path_local);
}
if (Directory.Exists(base_path_roaming))
{
s_folder_size += DirSize(new DirectoryInfo(base_path_roaming));
s_folder_paths.Add(base_path_roaming);
}
}
s_folder_size = s_folder_size / 1024 / 1024; // Mb
s_cache_size = s_cache_size / 1024 / 1024; // Mb
return (s_folder_exists,
s_folder_size, s_cache_size,
s_folder_paths, s_cache_paths);
}
private List<string> GetFoldersById(string base_path_local, string base_path_roaming)
{
var found_folders = new List<string>();
if (Directory.Exists(base_path_local))
{
found_folders.AddRange(Directory.GetDirectories(base_path_local, "Config", SearchOption.AllDirectories).ToList());
found_folders.AddRange(Directory.GetDirectories(base_path_local, "ConfigSave", SearchOption.AllDirectories).ToList());
found_folders.AddRange(Directory.GetDirectories(base_path_local, "SICache", SearchOption.AllDirectories).ToList());
}
if (Directory.Exists(base_path_roaming))
{
found_folders.AddRange(Directory.GetDirectories(base_path_roaming, "vrs-cache", SearchOption.AllDirectories).ToList());
}
return found_folders;
}
private Dictionary<string, (string Name, string Path)> GetBasesDictionary(string[] lines)
{
var bases_dict = new Dictionary<string, (string Name, string Path)>();
var (name, id, path) = ("", "", "");
foreach (string line in lines)
{
/* ---------- EXAMPLE
[Торговля(Рабочая)]
Connect=Srvr="winserv";Ref="ut2014_work";
ID=f8370086-654e-4807-b79b-3f51653c3699
OrderInList = 0
Folder=/Рабочие
OrderInTree = 0
External=1
ClientConnectionSpeed=Normal
App = Auto
WA=1
Version=8.2
DefaultApp=ThickClient
-------------------- */
if (line.StartsWith("[")) // Start
{
name = line.Substring(1, line.Length - 2);
id = "";
path = "";
}
else if (line.StartsWith("Connect=")) // Connect string
{
path = line.Substring(8);
}
else if (line.StartsWith("ID=")) // ID string
{
id = line.Substring(3);
}
if (name != "" && path != "" && id != "")
{
bases_dict.Add(id, (name, path));
name = "";
id = "";
path = "";
}
}
return bases_dict;
}
private string[] ReadFileContent(string path_to_file)
{
string full_path_to_file = Environment.ExpandEnvironmentVariables(path_to_file);
if (!File.Exists(full_path_to_file))
{
return null;
}
return System.IO.File.ReadAllLines(full_path_to_file);
}
private static long DirSize(DirectoryInfo d)
{
long size = 0;
// Add file sizes.
FileInfo[] fis = d.GetFiles();
foreach (FileInfo fi in fis)
{
size += fi.Length;
}
// Add subdirectory sizes.
DirectoryInfo[] dis = d.GetDirectories();
foreach (DirectoryInfo di in dis)
{
size += DirSize(di);
}
return size;
}
private void ButtonAbout_Click(object sender, EventArgs e)
{
FormAbout aboutForm = new FormAbout();
aboutForm.ShowDialog();
}
}
}