繁体   English   中英

如何将文件从特定文件夹复制到C#中的共享文件夹?

[英]How to copy file from a specific folder to a shared folder in C#?

我正在尝试将现有文件从特定文件夹复制到共享文件夹。 所以这是代码:

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);

我究竟做错了什么? 如果您需要更多数据,请告诉我...

编辑:

另外,最终目标是,这实际上应将文件保存到LAN网络中特定计算机上的共享文件夹中,但是我目前正在尝试将其保存在运行程序的同一台计算机上的共享文件夹中。

编辑2:

所以我尝试了@PaulKaram的建议,但仍然遇到下一个错误:

在此处输入图片说明

从图片中可以看到我首先保存图像的文档中的文件夹。 那没有问题。 当我尝试将其复制到桌面上的特定共享文件夹上时,对于已经在文档中创建的文件夹,会出现上述错误(访问被拒绝)。

错误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);
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM