В процессе создания приложения, которое исполняется от имени администратора. Приложение копирует и перезаписывает файлы, если указанный файл существует в определенных местах на 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