Вы должны войти, чтобы создавать сообщения и темы.

С# - Получить только имя папки, которая была изменена последним. [Решено]

Привет всем, мне нужно простое решение.
А именно:
Получить в определённой директории, путь к примеру C:\Program Files\
Самое важное, получить имя папки, не путь к этой папке ! Которая была изменена последнем (По дате изменения) и преобразовать в переменную. String.
И просто вывести его на лейбл, имя той самой папки.

Спасибо, кто решит помочь, с данным решением

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;

 

Лайкнули XpucT, Dapofig и Pixi
XpucTDapofigPixi

Всем привет 🖐
Вставлю свои пять копеек. 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);
Лайкнули XpucT, Сергей и Pixi
XpucTСергейPixi

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;

 

Лайкнули XpucT, Dapofig и Pixi
XpucTDapofigPixi

Спасибо вам, оба варианта подходят 👌

Лайкнул Сергей
Сергей

Ещё раз привет, уже вопрос в другом, но чтобы не делать новую тему, хотя скорее она относится к новой теме)

Я всё никак не могу понять метод конвертации 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, но я так и не понял. 
😪

Pixi, Привет. Не знаю с чем в Стиме связанны цифры из реестра, но у меня например в "C:\Program Files (x86)\Steam\config\config.vdf" лежит соответствующий "Accounts" "SteamID", а в "C:\Program Files (x86)\Steam\config\avatarcache" находится картинка со своим аватаром, название соответствует SteamID.

Лайкнул Pixi
Pixi
Цитата: Viсtor от 01.12.2022, 13:52

Pixi, "Accounts" "SteamID", а в "C:\Program Files (x86)\Steam\config\avatarcache" находится картинка со своим аватаром, название соответствует SteamID.

Привет, с кэш аватарок подходит, не знал, спасибо за подсказку)
Получается что мне нужно просто считать имя файла xD По тому-то же принципу, как и с папками

А вот файл config.vdf для меня спорный, так как он хранит довольно конфиденциальную информацию к примеру ключи авторизации даже в зашифрованном виде и логины от всех авторизированных аккаунтов на пк)

На скорую руку написанный код 😉

Собственно код

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;
            }      
        }

 

Лайкнул Pixi
Pixi