С# - Получить только имя папки, которая была изменена последним. [Решено]
Цитата: Pixi от 26.11.2022, 07:09Привет всем, мне нужно простое решение.
А именно:
Получить в определённой директории, путь к примеру C:\Program Files\
Самое важное, получить имя папки, не путь к этой папке ! Которая была изменена последнем (По дате изменения) и преобразовать в переменную. String.
И просто вывести его на лейбл, имя той самой папки.Спасибо, кто решит помочь, с данным решением
Привет всем, мне нужно простое решение.
А именно:
Получить в определённой директории, путь к примеру C:\Program Files\
Самое важное, получить имя папки, не путь к этой папке ! Которая была изменена последнем (По дате изменения) и преобразовать в переменную. String.
И просто вывести его на лейбл, имя той самой папки.
Спасибо, кто решит помочь, с данным решением
Цитата: Сергей от 26.11.2022, 07:47Pixi, приветствую 🖐
Решение:var path = @"Диск:\Папка\Нужная папка"; var dict = new Dictionary<DateTime, string>(); Directory.GetDirectories(path, "*.*", SearchOption.TopDirectoryOnly).ToList().ForEach(x => dict.Add(new DirectoryInfo(x).LastWriteTime, x)); var lastChangedFolder = dict.OrderByDescending(x => x.Key).First().Value; label1.Text = new DirectoryInfo(lastChangedFolder).Name;
Pixi, приветствую 🖐
Решение:
var path = @"Диск:\Папка\Нужная папка"; var dict = new Dictionary<DateTime, string>(); Directory.GetDirectories(path, "*.*", SearchOption.TopDirectoryOnly).ToList().ForEach(x => dict.Add(new DirectoryInfo(x).LastWriteTime, x)); var lastChangedFolder = dict.OrderByDescending(x => x.Key).First().Value; label1.Text = new DirectoryInfo(lastChangedFolder).Name;
Цитата: Dapofig от 26.11.2022, 14:08Всем привет 🖐
Вставлю свои пять копеек. Dictionary это хеш-таблица, то есть в случае добавления нескольких элементов с одинаковым ключом выбрасывается System.ArgumentException, что произошло в моём случае на Program Files с сообщениемAn item with the same key has already been added. Key: 06-Jun-21 10:57:20 PM.Вариант реализации:
var path = @"C:\Program Files\"; var directories = new DirectoryInfo(path).EnumerateDirectories(); var last = directories.OrderByDescending(d => d.LastWriteTime).FirstOrDefault()?.Name; // Console.WriteLine(last);
Всем привет 🖐
Вставлю свои пять копеек. Dictionary это хеш-таблица, то есть в случае добавления нескольких элементов с одинаковым ключом выбрасывается System.ArgumentException, что произошло в моём случае на Program Files с сообщением СкопированоAn item with the same key has already been added. Key: 06-Jun-21 10:57:20 PM.
Вариант реализации:
var path = @"C:\Program Files\"; var directories = new DirectoryInfo(path).EnumerateDirectories(); var last = directories.OrderByDescending(d => d.LastWriteTime).FirstOrDefault()?.Name; // Console.WriteLine(last);
Цитата: Сергей от 26.11.2022, 14:32Dapofig, приветствую 🖐
Спасибо за замечание 👍
Поправил своё решение, но Твоё всё равно короче =)var path = @"C:\Program Files"; var dict = new Dictionary<string, DateTime>(); Directory.GetDirectories(path, "*.*", SearchOption.TopDirectoryOnly).ToList().ForEach(x => dict.Add(x, new DirectoryInfo(x).LastWriteTime)); var lastChangedFolder = dict.OrderByDescending(x => x.Value).First().Key; label1.Text = new DirectoryInfo(lastChangedFolder).Name;
Dapofig, приветствую 🖐
Спасибо за замечание 👍
Поправил своё решение, но Твоё всё равно короче =)
var path = @"C:\Program Files"; var dict = new Dictionary<string, DateTime>(); Directory.GetDirectories(path, "*.*", SearchOption.TopDirectoryOnly).ToList().ForEach(x => dict.Add(x, new DirectoryInfo(x).LastWriteTime)); var lastChangedFolder = dict.OrderByDescending(x => x.Value).First().Key; label1.Text = new DirectoryInfo(lastChangedFolder).Name;
Цитата: Pixi от 27.11.2022, 10:08Спасибо вам, оба варианта подходят 👌
Спасибо вам, оба варианта подходят 👌
Цитата: Pixi от 01.12.2022, 10:39Ещё раз привет, уже вопрос в другом, но чтобы не делать новую тему, хотя скорее она относится к новой теме)
Я всё никак не могу понять метод конвертации steamid без каких либо api
Вот к примеру, я запрашиваю с реестра конкретный путь где установлен steamstring RegSteamPath = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Valve\Steam", "SteamPath", null)?.ToString(); string SteamPath = RegSteamPath + @"/userdata/"; var path = SteamPath; var dict = new Dictionary<DateTime, string>(); Directory.GetDirectories(path, "*.*", SearchOption.TopDirectoryOnly).ToList().ForEach(x => dict.Add(new DirectoryInfo(x).LastWriteTime, x)); var STEAM3 = dict.OrderByDescending(x => x.Key).First().Value; var steam3Id = new DirectoryInfo(STEAM3).Name; string id3 = "[U:1:" + steam3Id + "]"; label1.Text = id3;Я не могу понять, как мне полученный ID конвертировать в обычный Steamid64 так называемый Community
Есть идеи ? Мне говорили нужно просто прибавить id3 к 76561197960265728L и получить тот самый id, но я так и не понял.
😪
Ещё раз привет, уже вопрос в другом, но чтобы не делать новую тему, хотя скорее она относится к новой теме)
Я всё никак не могу понять метод конвертации steamid без каких либо api
Вот к примеру, я запрашиваю с реестра конкретный путь где установлен steam
string RegSteamPath = Registry.GetValue(@"HKEY_CURRENT_USER\Software\Valve\Steam", "SteamPath", null)?.ToString();
string SteamPath = RegSteamPath + @"/userdata/";
var path = SteamPath;
var dict = new Dictionary<DateTime, string>();
Directory.GetDirectories(path, "*.*", SearchOption.TopDirectoryOnly).ToList().ForEach(x => dict.Add(new DirectoryInfo(x).LastWriteTime, x));
var STEAM3 = dict.OrderByDescending(x => x.Key).First().Value;
var steam3Id = new DirectoryInfo(STEAM3).Name;
string id3 = "[U:1:" + steam3Id + "]";
label1.Text = id3;
Я не могу понять, как мне полученный ID конвертировать в обычный Steamid64 так называемый Community
Есть идеи ? Мне говорили нужно просто прибавить id3 к 76561197960265728L и получить тот самый id, но я так и не понял.
😪
Цитата: Viсtor от 01.12.2022, 13:52Pixi, Привет. Не знаю с чем в Стиме связанны цифры из реестра, но у меня например в "C:\Program Files (x86)\Steam\config\config.vdf" лежит соответствующий "Accounts" "SteamID", а в "C:\Program Files (x86)\Steam\config\avatarcache" находится картинка со своим аватаром, название соответствует SteamID.
Pixi, Привет. Не знаю с чем в Стиме связанны цифры из реестра, но у меня например в "C:\Program Files (x86)\Steam\config\config.vdf" лежит соответствующий "Accounts" "SteamID", а в "C:\Program Files (x86)\Steam\config\avatarcache" находится картинка со своим аватаром, название соответствует SteamID.
Цитата: Pixi от 01.12.2022, 14:07Цитата: Viсtor от 01.12.2022, 13:52Pixi, "Accounts" "SteamID", а в "C:\Program Files (x86)\Steam\config\avatarcache" находится картинка со своим аватаром, название соответствует SteamID.
Привет, с кэш аватарок подходит, не знал, спасибо за подсказку)
Получается что мне нужно просто считать имя файла xD По тому-то же принципу, как и с папкамиА вот файл config.vdf для меня спорный, так как он хранит довольно конфиденциальную информацию к примеру ключи авторизации даже в зашифрованном виде и логины от всех авторизированных аккаунтов на пк)
Цитата: Viсtor от 01.12.2022, 13:52Pixi, "Accounts" "SteamID", а в "C:\Program Files (x86)\Steam\config\avatarcache" находится картинка со своим аватаром, название соответствует SteamID.
Привет, с кэш аватарок подходит, не знал, спасибо за подсказку)
Получается что мне нужно просто считать имя файла xD По тому-то же принципу, как и с папками
А вот файл config.vdf для меня спорный, так как он хранит довольно конфиденциальную информацию к примеру ключи авторизации даже в зашифрованном виде и логины от всех авторизированных аккаунтов на пк)
Цитата: Viсtor от 01.12.2022, 16:29На скорую руку написанный код 😉
[spoiler title="Собственно код"]static void Main(string[] args) { if (Registry.CurrentUser.OpenSubKey("SOFTWARE")?.OpenSubKey("Valve")?.OpenSubKey("Steam")?.GetValue("SteamPath") is not string result) return; string pathFile = $"{result}\\config\\config.vdf"; if (File.Exists(pathFile) is not true) return; string readResultFile = File.ReadAllText(pathFile); if (readResultFile.IndexOf("\"Accounts\"") is int indexStart && indexStart >= 0) { var changes = readResultFile.Substring(indexStart); string resultWhile = string.Empty; StringReader stringReader = new StringReader(changes); bool exitWhile = false; while (exitWhile is false) { string resultReadLine = stringReader.ReadLine(); if (resultReadLine is null) return; if (resultReadLine == "\t\t\t\t{") { while (true) { var resultReadLineWhile2 = stringReader.ReadLine(); resultWhile += resultReadLineWhile2; if (resultReadLineWhile2 == "\t\t\t\t}") { exitWhile = true; break; } } } } IEnumerable<(string CommunityId, string Login)> resultOpeation = resultWhile. Replace("\t", ""). Replace("{", ""). Replace("}", ""). Replace("\"SteamID\"", ""). Split(new[] { "\"\"" }, StringSplitOptions.None). Select(x => x.Replace("\"", "")). Select((x, y) => new { Name = x, Index = y }). GroupBy(x => x.Index / 2). Select(x => new Tuple<string, string>(x.Last().Name, x.First().Name)). Select(x => (CommunityId: x.Item1, Login: x.Item2)); Process.Start(new ProcessStartInfo() { FileName = $"https://steamcommunity.com/profiles/{resultOpeation.First().CommunityId}", UseShellExecute = true}); } else { return; } }
[/spoiler]
На скорую руку написанный код 😉
static void Main(string[] args)
{
if (Registry.CurrentUser.OpenSubKey("SOFTWARE")?.OpenSubKey("Valve")?.OpenSubKey("Steam")?.GetValue("SteamPath") is not string result) return;
string pathFile = $"{result}\\config\\config.vdf";
if (File.Exists(pathFile) is not true) return;
string readResultFile = File.ReadAllText(pathFile);
if (readResultFile.IndexOf("\"Accounts\"") is int indexStart && indexStart >= 0)
{
var changes = readResultFile.Substring(indexStart);
string resultWhile = string.Empty;
StringReader stringReader = new StringReader(changes);
bool exitWhile = false;
while (exitWhile is false)
{
string resultReadLine = stringReader.ReadLine();
if (resultReadLine is null) return;
if (resultReadLine == "\t\t\t\t{")
{
while (true)
{
var resultReadLineWhile2 = stringReader.ReadLine();
resultWhile += resultReadLineWhile2;
if (resultReadLineWhile2 == "\t\t\t\t}")
{
exitWhile = true;
break;
}
}
}
}
IEnumerable<(string CommunityId, string Login)> resultOpeation = resultWhile.
Replace("\t", "").
Replace("{", "").
Replace("}", "").
Replace("\"SteamID\"", "").
Split(new[] { "\"\"" }, StringSplitOptions.None).
Select(x => x.Replace("\"", "")).
Select((x, y) => new { Name = x, Index = y }).
GroupBy(x => x.Index / 2).
Select(x => new Tuple<string, string>(x.Last().Name, x.First().Name)).
Select(x => (CommunityId: x.Item1, Login: x.Item2));
Process.Start(new ProcessStartInfo() { FileName = $"https://steamcommunity.com/profiles/{resultOpeation.First().CommunityId}", UseShellExecute = true});
}
else
{
return;
}
}