Удаление атрибута только для чтения в каталоге с использованием C # - PullRequest
16 голосов
/ 05 октября 2010

Мне удалось удалить атрибут «Только чтение» в файле, используя следующий фрагмент кода:

В файле main.cs

FileSystemInfo[] sqlParentFileSystemInfo = dirInfo.GetFileSystemInfos();

foreach (var childFolderOrFile in sqlParentFileSystemInfo)
{
    RemoveReadOnlyFlag(childFolderOrFile);
}

private static void RemoveReadOnlyFlag(FileSystemInfo fileSystemInfo)
{
    fileSystemInfo.Attributes = FileAttributes.Normal;
    var di = fileSystemInfo as DirectoryInfo;

    if (di != null)
    {
        foreach (var dirInfo in di.GetFileSystemInfos())
            RemoveReadOnlyFlag(dirInfo);
    }
}

К сожалению, это не работает в папках,После запуска кода, когда я захожу в папку, щелкните правой кнопкой мыши и выполните свойства, вот что я вижу:

alt text

Флаг только для чтения все еще проверен, хотя он был удален изфайлы под ним.Это приводит к сбою процесса удаления этой папки.Когда я вручную удаляю флаг и повторно запускаю процесс (файл bat), он может удалить файл (поэтому я знаю, что это не проблема с файлом bat)

Как мне удалить этот флаг в C #

Ответы [ 10 ]

8 голосов
/ 06 октября 2010

Вы также можете сделать что-то вроде следующего, чтобы рекурсивно очистить только для чтения (и архив и т. Д.) Для всех каталогов и файлов в указанном родительском каталоге:

private void ClearReadOnly(DirectoryInfo parentDirectory)
{
    if(parentDirectory != null)
    {
        parentDirectory.Attributes = FileAttributes.Normal;
        foreach (FileInfo fi in parentDirectory.GetFiles())
        {
            fi.Attributes = FileAttributes.Normal;
        }
        foreach (DirectoryInfo di in parentDirectory.GetDirectories())
        {
            ClearReadOnly(di);
        }
    }
}

Поэтому вы можете вызвать это так:

public void Main()
{
    DirectoryInfo parentDirectoryInfo = new DirectoryInfo(@"c:\test");
    ClearReadOnly(parentDirectoryInfo);
}
6 голосов
/ 05 октября 2010

Попробуйте DirectoryInfo вместо FileInfo

DirectoryInfo di = new DirectoryInfo(@"c:\temp\content");
di.Attributes = FileAttributes.Normal;

Для очистки атрибутов файлов -

foreach (string fileName in System.IO.Directory.GetFiles(@"c:\temp\content"))
{
    System.IO.FileInfo fileInfo = new System.IO.FileInfo(fileName);
    fileInfo.Attributes = FileAttributes.Normal;
}
3 голосов
/ 05 октября 2010

Диалог просто работает довольно странным образом.Он всегда отображается так, как вы видите его на снимке экрана, независимо от состояния атрибута ReadOnly.Флажок находится в неопределенном состоянии.Вы должны щелкнуть по нему и либо очистить, либо проверить, чтобы заставить его выполнять свои действия.И несмотря на текст приглашения (но не подсказку рядом с флажком), он только изменяет атрибут ReadOnly для файлов в каталоге, но не сам каталог.что на самом деле происходит.По всей вероятности, ваш код завершится ошибкой, поскольку каталог содержит файлы с установленным атрибутом ReadOnly.Вам придется их повторять.

2 голосов
/ 24 октября 2014

Флаг «только чтение» для каталогов в Windows на самом деле является неправильным. Папка не использует флаг только для чтения. Проблема будет с настройкой. Windows использует этот флаг для определения наличия настроек в папке.

Это старая запись, с проблемой, которая закатывается, но, полагаю, люди все еще могут столкнуться с ней, поскольку это довольно раздражает, когда вы нажимаете на нее.

Объяснение Microsoft

1 голос
/ 16 июля 2014

IEnumerable / лямбда-решение для рекурсивного удаления атрибута readonly из каталогов и файлов:

new DirectoryInfo(@"some\test\path").GetDirectories("*", SearchOption.AllDirectories).ToList().ForEach(
    di => {
        di.Attributes &= ~FileAttributes.ReadOnly;
        di.GetFiles("*", SearchOption.TopDirectoryOnly).ToList().ForEach(fi => fi.IsReadOnly = false);
    }
);
1 голос
/ 03 июля 2014

На всякий случай, если что-нибудь случится через это позже ...

ВСЕ другие ответы, опубликованные перед моим, либо неверны, либо используют ненужную рекурсию.

Прежде всего "Только чтение""флажок в диалоге свойств окон всегда имеет маркер трех состояний для папок.Это потому, что сама папка не только для чтения, но файлы внутри могут быть.

Если вы хотите установить / снять флажок только для чтения для ВСЕХ файлов.Вы можете сделать это просто следующим образом:

void SetReadOnlyFlagForAllFiles(DirectoryInfo directory, bool isReadOnly)
{
    // Iterate over ALL files using "*" wildcard and choosing to search all directories.
    foreach(FileInfo File in directory.GetFiles("*", SearchOption.All.Directories))
    {
        // Set flag.
        File.IsReadOnly = isReadOnly;
    }
}
1 голос
/ 05 октября 2010

Установите свойство Attributes для оригинала dirInfo:

dirInfo.Attributes = FileAttributes.Normal;

FileSystemInfo[] sqlParentFileSystemInfo = dirInfo.GetFileSystemInfos();

foreach (var childFolderOrFile in sqlParentFileSystemInfo)
{
    RemoveReadOnlyFlag(childFolderOrFile);
}
0 голосов
/ 09 февраля 2015

Это может быть, а может и не быть напрямую связано, но основная проблема в вашем случае может быть вызвана соответствующими файлами.Например, я столкнулся с этой проблемой при попытке удалить каталог:

System.IO.Directory.Delete(someDirectory, true)

В результате «Доступ к пути« бла »запрещен».Чтобы решить эту основную проблему, я удалил атрибут «только чтение» для вложенных файлов, а затем смог удалить родительский каталог.В моем случае я использовал powershell, поэтому вы можете использовать эквивалент .NET.

dir -r $PrePackageDirectory |% {if ($_.PSIsContainer -ne $true){$_.IsReadOnly = $false}}
0 голосов
/ 13 августа 2013
Shell("net share sharefolder=c:\sharefolder/GRANT:Everyone,FULL")


Shell("net share sharefolder= c:\sharefolder/G:Everyone:F /SPEC B")


Shell("Icacls C:\sharefolder/grant Everyone:F /inheritance:e /T")


Shell("attrib -r +s C:\\sharefolder\*.* /s /d", AppWinStyle.Hide)

этот код работает для меня .. чтобы поделиться папкой для всех с правами на чтение и запись

0 голосов
/ 01 июля 2013

Я вижу, что @DotnetDude сказал в комментариях, что решения парней не работают. На мой взгляд, это происходит потому, что ребята не упомянули, что для применения новых атрибутов нужно использовать метод File.SetAttributes .

...