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

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

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

Я ищу способ либо изменить атрибуты извлеченного 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");   

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

Путь назначения ведет к C:\users\mydocs\ISODump\subTest

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

ОБНОВЛЕНИЕ 2

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

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

Спасибо


person ELSheepO    schedule 23.05.2012    source источник
comment
I've tried changing it from the properties menu, and from code in c#. Neither worked.. Если вы не можете изменить его из меню свойств, вы не можете ожидать, что он будет работать из кода C#. Проблема с разрешениями? Вы не пытаетесь изменить файлы на диске только для чтения (например, смонтированный iso)?   -  person Kevin Gosse    schedule 23.05.2012
comment
@KooKiz Я не думаю, что это проблема с разрешениями, потому что после создания исключения доступ будет запрещен, если я зайду в подпапку и изменю разрешения для каждого файла, я могу сделать это, а затем скопировать их. Но то, что я хочу сделать, это сделать все это сразу после извлечения.   -  person ELSheepO    schedule 23.05.2012
comment
Итак, теперь мы знаем, что выдается исключение «Отказано в доступе». Пожалуйста, предоставьте всю информацию заранее. Какая именно строка вашего кода вызывает исключение?   -  person Kevin Gosse    schedule 23.05.2012
comment
Эй, я думаю, что ваши файлы предварительно доступны только для чтения, так как я создал короткий iso и проверил, что после извлечения файлы не были доступны только для чтения ... Так что это не вина кода ISO Extractor ... Так что вам следует использовать какой-то другой код [возможно из ответов] сделать файлы доступными для записи!   -  person Writwick    schedule 23.05.2012
comment
извините, я не включил это, просто выскочил из головы. Access to the path 'C:\Documents and Settings\user\My Documents\ISO DUMP!!\extracted ISO\Test\subtetst' is denied. - это исключение, которое выдается. Если я выйду за пределы IDE и щелкну правой кнопкой мыши, скопирую, а затем вставлю в свои документы, это сработает, поэтому у меня есть доступ. Попробовал ответ Стива, это не сработало, теперь я запускаю ответ Ниранджана Калы.   -  person ELSheepO    schedule 23.05.2012
comment
В какой строке вы получили исключение? Directory.GetFiles или File.Copy?   -  person Steve    schedule 23.05.2012


Ответы (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"

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

person Steve    schedule 23.05.2012
comment
Виноват. IsReadOnly=False, а не True - person Steve; 23.05.2012
comment
Не могли бы вы показать мне значения txtCopyFrom.Text и txtCopyTo.Text до начала вашей обработки. Эти два значения являются началом всего - person Steve; 24.05.2012
comment
txtCopyto.Text "C:\\Documents and Settings\\user\\My Documents\\ISO DUMP!!\\extracted iso" и txtCopyFrom — это просто местоположение сервера, я использую его, чтобы получить имя iso и удалить расширение .iso, чтобы назвать папку - person ELSheepO; 24.05.2012

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

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

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

person Niranjan Singh    schedule 23.05.2012
comment
По-прежнему получайте исключение Denied, описанное в комментариях выше. Спасибо сурово, очень признателен - person ELSheepO; 23.05.2012
comment
у него все еще есть проблема .. попробуйте использовать win32Api - person Niranjan Singh; 23.05.2012
comment
Что такое win32api и где его взять? - person ELSheepO; 25.05.2012
comment
проверить последнюю строку ответа и указанную ссылку - person Niranjan Singh; 25.05.2012