mirror of
https://bitbucket.org/FuketsuBaka/clearcache1c.git
synced 2024-12-22 18:43:14 +00:00
423 lines
17 KiB
C#
423 lines
17 KiB
C#
|
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();
|
|||
|
}
|
|||
|
}
|
|||
|
}
|