Извлеченные файлы всегда доступны только для чтения

Я извлекаю ISO, а затем копирую папку из извлеченного ISO. Проблема в том, что извлеченные файлы доступны только для чтения. Я попытался изменить его из меню свойств и из кода в C#. Ни один не работал.

Код, который я использовал для извлечения ISO, находится в другом вопросе: автоматически извлекать ISO с помощью WinRar с помощью C# или пакета

Я ищу способ изменить атрибуты извлеченного ISO, чтобы я мог копировать из его подпапок, или просто изменить разрешения подпапок.

заранее спасибо

ОБНОВИТЬ

новый код

 string[] folderToName = txtCopyFrom.Text.Split('\\');
        string isoName = folderToName[folderToName.Length - 1];
        isoName = isoName.Remove(isoName.Length - 4, 4);

        string copyTestFrom = txtCopyTo.Text + @"\"+ isoName + @"\Test\subTest";
        string[] folderName = txtCopyFrom.Text.Split('\\');
        string folderTestTo = folderName[folderName.Length - 1];
        folderTestTo = folderTestTo.Remove(folderTestTo.Length - 4, 4);
        string copyTest = txtCopyTo.Text;
        System.IO.Directory.CreateDirectory(copyTest);

        DirectoryInfo di = new DirectoryInfo(copyTestFrom);
        di.Attributes &= ~FileAttributes.ReadOnly;

        foreach (FileInfo fi in di.GetFiles())
        {
            fi.IsReadOnly = false;

            string destinationPath = Path.Combine(copyTest, Path.GetFileName(copyTestFrom));
            File.Copy(copyTestFrom, destinationPath);
        }
        MessageBox.Show("Files Copied");   

Файлы в подтесте не только для чтения, только сама папка.

Целевой путь идет к C:\users\mydocs\ISODump\subTest

После access denied исключение я могу скопировать папку вручную

ОБНОВЛЕНИЕ 2

обходной путь

Нашел работу вокруг, для моих целей. directory.move достигает желаемой цели, перемещая папку, а не копируя ее.

Спасибо

2 ответа

Попробуйте использовать этот код

   fileInfo.IsReadOnly = False

вместо

fileInfo.Attributes = FileAttributes.Normal

Что-то не так в вашем коде выше: эти строки, учитывая путь в одном из ваших комментариев

"C:\Documents and Settings\user\My Documents\ISO DUMP!!\extracted ISO\Test\subtetst"
                                                                           ^^^^^^^^
string folderTestTo = folderName[folderName.Length - 1];            
folderTestTo = folderTestTo.Remove(folderTestTo.Length - 4, 4);            
string copyTestTo = folderTestTo;    

вернет это значение в copyTestTo:

subt

тогда вы делаете

string destinatationPath = Path.Combine(copyTestTo, 
                                        Path.GetFileName(copyTestFrom));

и это даст что-то невозможное, как этот путь

 "subt\C:\Documents and Settings\user\My Documents\ISO DUMP!!\extracted ISO\Test\subtetst"

Я думаю, что вы должны тщательно проверить эти отрывки в вашем коде, установить некоторую точку останова и проверить значения ваших переменных.

Вы можете попробовать это, чтобы изменить атрибуты:

foreach (string fileName in System.IO.Directory.GetFiles(path))
{
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);

    fileInfo.Attributes |= System.IO.FileAttributes.ReadOnly;
    // or
    fileInfo.IsReadOnly = true;
}

Вы можете попробовать это, чтобы рекурсивно установить атрибут для всех подкаталогов и файлов:

DirectoryInfo di = new DirectoryInfo(directorypath);
public void Recurse(DirectoryInfo directory)
{
    foreach (FileInfo fi in directory.GetFiles())
    {
        fi.IsReadOnly = false; // or true
    }

    foreach (DirectoryInfo subdir in directory.GetDirectories())
    {
        Recurse(subdir);
    }
}

Проверьте, есть ли у пользователя доступ для записи в папку. Проверьте,если проблема не устранена, я считаю, что решение должно заключаться в использовании Windows Shell API.

Другие вопросы по тегам