Получение System.InvalidOperationException: 'Ошибка при изменении коллекции при переходе в собственность файлов - PullRequest
0 голосов
/ 02 мая 2020

В процессе создания приложения, которое исполняется от имени администратора. Приложение копирует и перезаписывает файлы, если указанный файл существует в определенных местах на C: \. Если администратор не имеет доступа для выполнения операции с запрошенным файлом, то приложение переходит в собственность и назначает администратору полное разрешение на управление. Пользователь, чтобы они могли перезаписать указанный файл.

, однако я получаю следующую ошибку, когда он пытается это сделать:

System.InvalidOperationException: 'Collection was modified; enumeration operation may not execute.' 

Я читал, что циклы Foreach не могут быть изменено в процессе итерации. Поэтому я преобразовал свой код для использования For l oop, но проблема все еще сохраняется! Я потратил много часов, пытаясь заставить это работать и исследовать, но в конечном итоге я пошел по кругу, любая помощь будет оценена. Ниже мой код:


    string[] lines = File.ReadAllLines(@"C:\Temp2\BarsInstaller\FilesToInstall.txt");
    string sourcePath = @"C:\Temp2\BarsInstaller\";

            for (int i = 0; i <= lines.Length; i++)
            {


                string[] col = lines[i].Split('=');
                string fileName = col[0];
                string pathName = col[1];


                string fullDestPath = pathName + fileName;
                string fileCopyToLocation = pathName;
                string fulleSourcePath = sourcePath + fileName;



                copyFilesToInstall(fulleSourcePath, fullDestPath, fileCopyToLocation);

}

void copyFilesToInstall(string sourceFile, string destFile, string target)

        {
            if (Directory.Exists(target) == false)
            {
                Directory.CreateDirectory(target);
            }

            //1 check if we have permissions to overrite the file or copy file to directory
            //if we dont then give us permisison

            string fileName = destFile;

            Console.WriteLine("Adding access control entry for "
                + fileName);


            // Get a FileSecurity object that represents the
            // current security settings.
 if (File.Exists(destFile))
{
                FileSecurity fSecurity = File.GetAccessControl(destFile);

  // Add the FileSystemAccessRule to the security settings.
 fSecurity.AddAccessRule(new FileSystemAccessRule(WindowsIdentity.GetCurrent().User,
FileSystemRights.FullControl, AccessControlType.Allow));
fSecurity.SetOwner(WindowsIdentity.GetCurrent().User);

 using (new ProcessPrivileges.PrivilegeEnabler(Process.GetCurrentProcess(), Privilege.TakeOwnership))
                {
                    fSecurity.SetOwner(WindowsIdentity.GetCurrent().User); //ERROR OCCURS HERE
                }


                // Set the new access settings.
                File.SetAccessControl(destFile, fSecurity);         

}


}

Полный след стека

at System.ThrowHelper.ThrowInvalidOperationException(ExceptionResource resource)\r\n   
at System.Collections.Generic.Dictionary`2.Enumerator.MoveNext()\r\n   
at ProcessPrivileges.PrivilegeEnabler.InternalDispose() 
in C:\\Users\\bazile\\source\\repos\\ProcessPrivileges\\src\\ProcessPrivileges.Shared\\PrivilegeEnabler.cs:line 191\r\n   
at ProcessPrivileges.PrivilegeEnabler.Dispose() in C:\\Users\\bazile\\source\\repos\\ProcessPrivileges\\src\\ProcessPrivileges.Shared\\PrivilegeEnabler.cs:line 149\r\n  
 at BarsInstaller.Form1.copyFilesToInstall(String sourceFile, String destFile, String target) in D:\\SourceControl\\BarsInstaller\\BarsInstaller\\Form1.cs:line 224

1 Ответ

0 голосов
/ 02 мая 2020

Теперь я решил эту проблему с помощью @OguzOzgul, проблема заключалась в том, что у используемого пакета Nuget была ошибка версии 1.5.7, поэтому я скачал исходный код с этого сайта: https://archive.codeplex.com/?p=processprivileges построил его и добавил DLL в качестве ссылки, и эта ошибка теперь исчезла.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...