Как скопировать файл из определенной папки в общую папку в C #? - PullRequest
0 голосов
/ 29 октября 2018

Я пытаюсь скопировать существующий файл из определенной папки в общую папку. Так что это код:

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:

Кроме того, конечной целью является сохранение файлов в общей папке на определенном компьютере в сети LAN, но в настоящее время я пытаюсь сохранить их в общей папке на том же компьютере, где работает программа.

РЕДАКТИРОВАТЬ 2:

Итак, я попробовал то, что было предложено @PaulKaram, но все еще получаю следующую ошибку:

enter image description here

Из рисунка видно папку в Документах, где я сначала сохраняю изображение. Это идет без проблем. Когда я пытаюсь скопировать его в определенную общую папку на рабочем столе, вышеупомянутая ошибка (доступ запрещен) возникает для папки, уже созданной в Documents.

1 Ответ

0 голосов
/ 01 ноября 2018

Ошибка 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);
        }
    }
}
...