1

Тема: Помилка Access to path was denied при перейменуванні файлів на диску C

Доброго дня! Створюю програму з використанням WPF для надання файлам у певній папці рандомних імен.
Маю проблему – при виборі папки на диску С програма видає помилку System.UnauthorizedAccessException: 'Access to the path is denied.'. З папками не на диску С все працює.
Запуск ехе-файлу від імені адміністратора не допомагає. В "app.manifest" встановлював значення <requestedExecutionLevel level="requireAdministrator" uiAccess="false" />, теж не допомагає.
Як можна вирішити цю проблему?

Ось код програми:

Прихований текст
private void Button_Click(object sender, RoutedEventArgs e)
{
    Microsoft.Win32.OpenFolderDialog dialog = new();

    dialog.Multiselect = true;
    dialog.Title = "Select a folder";

    // Show open folder dialog box
    bool? result = dialog.ShowDialog();

    string fullPathToFolder;

    // Process open folder dialog box results
    if (result == true)
    {
        // Get the selected folder
        fullPathToFolder = dialog.FolderName;
        DirectoryInfo d = new DirectoryInfo(fullPathToFolder);
        FileInfo[] infos = d.GetFiles();
        foreach (var file in infos)
        {
            string finalFileName = Path.GetRandomFileName();
            finalFileName = Path.ChangeExtension(finalFileName, null); // Remove the extension

            string newFilePath = Path.Combine(file.DirectoryName, finalFileName + file.Extension);

            if (!File.Exists(newFilePath)) // Check if the file with the new name exists
            {
                File.Move(file.FullName, newFilePath);
            }
        }
    }
}

2

Re: Помилка Access to path was denied при перейменуванні файлів на диску C

Смішний, хто тобі дасть таке неподобсто витворяти?!

3

Re: Помилка Access to path was denied при перейменуванні файлів на диску C

Складно без доступу до комп'ютера сказати, але, швидше за все, там просто тека належить іншому користувачеві. "Права адміністратора" тут не допоможуть, треба запускати програму від імені користувача, що має права на зміну файлів у теці (або змінити ці права у файлів у теці).
Яку хоч теку обрали, не C:\Windows\System32 ?

Подякували: leofun011

4

Re: Помилка Access to path was denied при перейменуванні файлів на диску C

Користувач в системі лише один, права, відповідно, повні.
Тека "C:\Users\*користувач*\Pictures\*папка з фото*".

Схожа програма з використання консолі має доступ на перейменування файлів в цій папці, але WPF-додаток ні.

Код консольної проги
using System;
using System.IO;

namespace RandomNamesGenerator
{
    internal class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Write path to folder with files to rename (like \"C:\\Users\\*Username*\\Pictures\"):");
            string folderPath = Console.ReadLine();
            IEnumerable<string> files = Directory.EnumerateFiles(folderPath);

            Console.WriteLine("If you want to rename all files in folder, than write \"all\"");
            Console.WriteLine("If you want to rename only specific files, write file extension (like \".png\")");
            Console.WriteLine("What files do you want to rename: ");
            string fileExtension = Console.ReadLine();

            foreach (string file in files)
            {
                FileInfo fileInfo = new FileInfo(file);
                if (fileExtension == "all") {
                    string finalFileName = Path.GetRandomFileName();
                    File.Move(file, $"{folderPath}\\{finalFileName}{fileInfo.Extension}");
                }
                else if (fileInfo.Extension == fileExtension){
                    string finalFileName = Path.GetRandomFileName();
                    File.Move(file, $"{folderPath}\\{finalFileName}{fileExtension}");
                }
            }
        }
    }
}

5

Re: Помилка Access to path was denied при перейменуванні файлів на диску C

Trap_o написав:

Користувач в системі лише один, права, відповідно, повні.

Бувають же такі наївні люди...

Утім, до теки C:\Users\*користувач*\ доступ має бути.

Якщо ви перепишете обидві програми, щоб вони використовували однакові функції для перейменування, то зможете локалізувати проблему (і зробите код значно чистішим). До речі, а на якій саме функції виникає виключна ситуація? Продебажте. І чи ви певні, що правильно назви файлів збираєте в першому коді?

Подякували: leofun011