Извлеченные файлы всегда доступны только для чтения
Я извлекаю 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.