Я пытаюсь скопировать существующий файл из определенной папки в общую папку. Итак, это код:
if (!System.IO.File.Exists(fullPath))
{
using (WindowsIdentity.GetCurrent().Impersonate())
{
try
{
image.Save(fullPath);
System.Security.AccessControl.DirectorySecurity sec = System.IO.Directory.GetAccessControl(originalDocumentFolderPath);
FileSystemAccessRule accRule = new FileSystemAccessRule(originalDocumentFolderPath, FileSystemRights.FullControl, AccessControlType.Allow);
sec.AddAccessRule(accRule);
string sharedFolderPath = "\" + Path.Combine(Environment.MachineName, "Users");
sharedFolderPath = Path.Combine(sharedFolderPath, username);
sharedFolderPath = Path.Combine(sharedFolderPath, "Desktop");
sharedFolderPath = Path.Combine(sharedFolderPath, "SharedFolder");
System.IO.File.Copy(originalDocumentFolderPath, sharedFolderPath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}
И я получаю эту ошибку:
System.Security.Principal.IdentityNotMappedException: «Некоторые или все ссылки на идентификаторы не могут быть переведены».
на этой линии:
sec.AddAccessRule(accRule);
Что я делаю неправильно? Если вам нужно больше данных, пожалуйста, дайте мне знать ...
РЕДАКТИРОВАТЬ:
Кроме того, конечная цель состоит в том, что это фактически должно сохранять файлы в общей папке на конкретном компьютере в локальной сети, но в настоящее время я пытаюсь сохранить его в общей папке на том же компьютере, на котором запускается программа.
EDIT 2:
Поэтому я попробовал то, что предложил @PaulKaram, но я все еще получаю следующую ошибку:
На картинке можно увидеть папку в документах, где я сначала сохраняю изображение. Это происходит без проблем. Когда я пытаюсь скопировать его в конкретной общей папке на рабочем столе, ошибка выше (отказ в доступе) возникает для папки, уже созданной в Documents.
Всего 1 ответ
Ошибка Some or all identity references could not be translated
что идентификатор / учетная запись, которую вы используете, не найден. Если глубже взглянуть, мы увидим, что у вас есть проблема с этой строкой:
FileSystemAccessRule accRule = new FileSystemAccessRule(originalDocumentFolderPath, FileSystemRights.FullControl, AccessControlType.Allow);
Взгляните на конструктор FileSystemAccessRule
который вы используете. Вот подпись:
public FileSystemAccessRule (string identity, System.Security.AccessControl.FileSystemRights fileSystemRights, System.Security.AccessControl.AccessControlType type);
Первым аргументом, который следует отправить, является личность, взятая из документации:
Имя учетной записи пользователя.
Я не уверен, что вы отправляете туда в originalDocumentFolderPath
.
Предполагая, что username
содержит идентификатор, выданный вам, эта строка должна быть изменена на:
FileSystemAccessRule accRule = new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow);
Еще две вещи, о которых вы должны знать:
Прежде всего, вы работаете с общей папкой в сети, поэтому вам нужно исправить эту строку:
string sharedFolderPath = "\" + Path.Combine(Environment.MachineName, "Users");
в это:
string sharedFolderPath = "\\" + Path.Combine(Environment.MachineName, "Users");
Когда вы работаете с сетевой папкой, вам нужно иметь двойную обратную косую черту в начале, а так как на C#
обратная косая черта пропускает символы, вам нужно записать ее как \\
.
Во-вторых, вы должны также отметить, что вы пытаетесь скопировать файл и присвоить ему имя папки в качестве адресата. Чтобы исправить это, вы должны добавить в конце объединения пути к общей папке:
sharedFolderPath = Path.Combine(sharedFolderPath, "file.extension");
В конце, вот ваш полный код, который должен работать так, как предполагалось:
if (!System.IO.File.Exists(fullPath))
{
using (WindowsIdentity.GetCurrent().Impersonate())
{
try
{
image.Save(fullPath);
System.Security.AccessControl.DirectorySecurity sec = System.IO.Directory.GetAccessControl(originalDocumentFolderPath);
FileSystemAccessRule accRule = new FileSystemAccessRule(username, FileSystemRights.FullControl, AccessControlType.Allow);
sec.AddAccessRule(accRule);
string sharedFolderPath = "\\" + Path.Combine(Environment.MachineName, "Users");
sharedFolderPath = Path.Combine(sharedFolderPath, username);
sharedFolderPath = Path.Combine(sharedFolderPath, "Desktop");
sharedFolderPath = Path.Combine(sharedFolderPath, "SharedFolder");
sharedFolderPath = Path.Combine(sharedFolderPath, "file.extension");
System.IO.File.Copy(originalDocumentFolderPath, sharedFolderPath);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
}