0

ISO を抽出し、抽出した ISO からフォルダーをコピーしています。問題は、抽出されたファイルが読み取り専用であることです。プロパティメニューとC#のコードから変更しようとしました。どちらも機能しませんでした。

ISO を抽出するために使用したコードは別の質問にあります: c# またはバッチを使用して winrar で ISO を自動的に抽出します。

抽出した 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

上記のコードに何か問題があります: これらの行は、コメントの 1 つのパスを指定すると

"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"

コード内のこれらの箇所を注意深くチェックして、そこにいくつかのブレークポイントを設定し、変数の値を調べる必要があると思います

于 2012-05-23T08:11:16.647 に答える