【问题标题】:How to Copy a file to Network Location from Windows Service?如何将文件从 Windows 服务复制到网络位置?
【发布时间】:2011-03-16 18:05:41
【问题描述】:

我希望在 Windows Server 2008 服务器上运行 Windows 服务,该服务将监视本地服务器上的目录(即 C:\Watch),当在该目录中创建新的 pdf 时,将文件复制到网络共享(即。//192.168.1.2/Share)。

这两个服务器都不是域的成员。

Windows 服务已将其登录设置为本地用户帐户,该用户帐户可以访问 //server/share 并毫无问题地创建和删除文件。

如果 sourceDir 和 destDir 是本地文件夹,如 C:\Source 和 C:\Dest,我有以下工作正常,但如果我将 destDir 更改为网络位置,如 //server/share/ 或 /// /server//share// 我收到错误“T文件名、目录名或卷标语法不正确”。

更新: 我不再收到上面的错误,现在当我将 sourceDir 设置为 C:\Watch 并将 destDir 设置为 \server\share\ (服务器可以是 Windows 或 Ubuntu 服务器时,我收到 System.UnauthorizedAccess 错误我假设来自目标服务器。如何设置连接到目标服务器时使用的凭据。记住服务器不在域中,可以是 windows 或 Ubuntu。

public partial class Service1 : ServiceBase
{
    private FileSystemWatcher watcher;
    private string sourceFolder;
    private string destFolder;

    public Service1()
    {
        InitializeComponent();
    }

    protected override void OnStart(string[] args)
    {
        this.sourceFolder = Properties.Settings.Default.sourceDir;
        this.destFolder = Properties.Settings.Default.destDir;

        watcher = new FileSystemWatcher();
        watcher.Path = this.sourceFolder;
        watcher.NotifyFilter = NotifyFilters.LastAccess | NotifyFilters.LastWrite | NotifyFilters.FileName | NotifyFilters.DirectoryName;
        watcher.Filter = "*.pdf";

        watcher.Created += new FileSystemEventHandler(watcher_Created);

        watcher.EnableRaisingEvents = true;
    }

    protected override void OnStop()
    {
    }

    private void watcher_Created(object source, FileSystemEventArgs e)
    {
        FileInfo fInfo = new FileInfo(e.FullPath);
        while (IsFileLocked(fInfo))
        {
            Thread.Sleep(500);
        }
        System.IO.File.Copy(e.FullPath, this.destFolder + e.Name);
        System.IO.File.Delete(e.FullPath);
    }
}

【问题讨论】:

    标签: c# windows-services


    【解决方案1】:

    服务器共享为:

    string networkShare = @"\\ServerName\Share\";
    

    另外请记住,服务正在执行的身份将影响服务是否能够保存到该位置。如果您使用域服务帐户来运行服务,请确保从共享所在的计算机调整目标共享文件夹上的 ACL 以允许写入

    【讨论】:

    • 谢谢。我对@"\\server\share\" 进行了硬编码,但现在出现以下错误“系统无法访问该文件”。所以我想这是一个权限问题,即使当我以用户身份登录时,服务设置为登录,因为我可以在 \\server\share 中创建文件
    • 在旁注中,当路径是字符串变量时,我如何在 @"\\server\share\" 中使用 @。
    • 您可以将目标存储在您的 app.config 中并从那里读取它,在 app.config 中它只需要是 \\server\share
    【解决方案2】:

    基于 Oded 的回答 here 一旦我以本地用户的身份运行该服务,该服务也设置在远程 Ubuntu 服务器上,一切都像魅力一样工作。

    【讨论】:

    • 这对您很有帮助,请将您自己的答案标记为已接受或我的答案,这样其他人可能会受益。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 1970-01-01
    • 2019-03-02
    相关资源
    最近更新 更多