C#无法找到指定的文件。

3

你好,我正在尝试创建一个应用程序,使用msg.exe在网络上发送消息。

当我从命令提示符中执行msg时,一切正常,但是当我使用表单打开命令提示符时,我无法执行该操作。我使用cmd进入system32文件夹,但是该文件没有显示出来。但是当我浏览或正常使用cmd时,它就会出现,并且一切正常。

我在另一台计算机上进行了测试,该应用程序可以正常工作,但是在这个win 7 64位系统的计算机上无法正常工作。

这是我用来打开cmd的代码示例:

Process.Start("cmd");

我以管理员身份运行,已尝试直接从msg.exe执行,但似乎是64位系统的问题,所有32位系统都可以正常工作,但任何64位系统都不行。

编辑:好的,我找到了问题所在,当运行64位系统时,32位应用程序无法在system32文件夹中运行64位应用程序。尝试访问此文件夹时,它会重定向到%WinDir%\SysWOW64。解决方法是使用此路径C:\Windows\Sysnative\file(%windir%\Sysnative)。


添加一些代码并使您的问题更清晰一些。你的问题是什么? - Restuta
当您尝试直接从命令提示符执行msg.exe时,您是否已经以管理员身份登录? - Cody Gray
是的,我正在以管理员身份运行,尝试直接使用msg.exe,使用Process.Start("msg.exe", "/C msg /server:xxx xxx message");但是出现了“系统找不到指定的文件”错误。 - Splendid
6个回答

2

问题中提到的解决方案对我很有帮助 - 在此为后人发布可测试的解决方案:

public class Messenger : IMessenger
{
    private readonly IProcessWrapper _process;

    public Messenger(IProcessWrapper process)
    {
        _process = process;
    }

    public void SendMessage(string message)
    {
        var info = new ProcessStartInfo
            {
                WorkingDirectory = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Windows), "sysnative"),
                FileName = "msg.exe",
                Arguments = string.Format(@" * ""{0}""", message),
                WindowStyle = ProcessWindowStyle.Hidden,
                UseShellExecute = true,
                Verb = "runas"
            };
        _process.Start(info);
    }
}


public interface IProcessWrapper : IDisposable
{
    IEnumerable<Process> GetProcesses();
    void Start(ProcessStartInfo info);
    void Kill();

    bool HasExited { get; }
    int ExitCode { get; }
}

1

如果您正在使用应用程序,最好直接执行 "msg"

Process.Start("msg");

或者

ProcessStartInfo startInfo = new ProcessStartInfo();
startInfo.FileName = "msg.exe";
startInfo.Arguments = "/SERVER hellowword";
startInfo.WorkingDirectory = @"C:\Temp";
startInfo.WindowStyle = ProcessWindowStyle.Maximized;
startInfo.ErrorDialog = true;
Process process = Process.Start(startInfo);

尝试了那段代码后,出现了一个错误,Windows找不到msg.exe这个文件,有点奇怪,我确实直接把代码放进去了,但它似乎找不到这个文件。然后我用命令提示符(cmd)检查了目录,发现它没有列出来。如果我正常使用命令提示符或浏览文件夹,文件就在那里。甚至尝试创建一个快捷方式并执行它,但显示该快捷方式未链接到任何内容。 - Splendid

1
Process p = new Process();
System.Diagnostics.ProcessStartInfo sinfo = new System.Diagnostics.ProcessStartInfo("C:\\Windows\\System32\\msg.exe");
p.StartInfo.Arguments=String.Format("/server:{0} {1} {2}",toServer,string.Compare(toUser.Trim(), "") == 0 ? "*" : toUser,message);
p.StartInfo = sinfo;
p.StartInfo.CreateNoWindow = true;
p.StartInfo.FileName = "msg.exe";
p.Start();

您可能需要为进程的StartInfo设置“用户名”和“密码”。(“msg.exe”驻留在系统文件夹中,运行代码的用户没有运行该文件夹的适当权限。)

抱歉,我对编程还有点陌生,那段代码中需要更改任何值吗?toServer和toUser显示当前上下文中不存在。 - Splendid
你需要设置一些东西(在VS中显示为红色的任何内容)!(也许需要设置p.StartInfo.UserName | p.StartInfo.Password) - abmv
有没有机会给我一个例子?:P - Splendid

1
你是否需要使用cmd?为什么不直接使用Process.Start调用msg.exe呢?如果你知道它的位置,应该可以运行它。

尝试过了,它说找不到文件。 - Splendid
据我所见,这似乎是一个Win 64位的问题,在所有32位上都可以工作,但在64位上无法工作。 - Splendid

1
也许您应该检查要构建的“目标平台”。在我的64位Win7电脑上,我应该选择“x64”或“任何CPU”,以便让我的代码找到“msg.exe”。

0

在某些 Windows 版本(例如 Home 版,而不是 Professional/Business 等)中,msg.exe 不包含在内。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接