0

我正在提取 ISO,然后从提取的 ISO 中复制一个文件夹。问题是提取的文件是只读的。我尝试从属性菜单和 c# 中的代码更改它。都没有奏效。

我用于提取 ISO 的代码在另一个问题中:extract ISO with winrar automatic with c# or batch

我正在寻找一种方法来更改提取的 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通过移动文件夹而不是复制它来达到我想要的目的。

谢谢

4

2 回答 2

1

你可以试试这个来改变属性:

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

于 2012-05-23T08:10:59.987 回答
1

尝试使用此代码

   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"

我认为你应该仔细检查代码中的这些段落,在那里设置一些断点并检查你的 vars 的值

于 2012-05-23T08:11:16.647 回答