【问题标题】:Application runs batch file which can't delete file应用程序运行无法删除文件的批处理文件
【发布时间】:2014-07-01 12:41:13
【问题描述】:

我有一个 C# 应用程序,它创建一个批处理文件然后运行它。这个批处理文件调用了一个应该删除某个文件的 C++ 应用程序。

当我运行 C# 应用程序时:

  • 创建批处理文件没问题
  • 运行批处理文件没问题
  • 删除文件失败。

这是 C++ 代码和documentation:

// Attempt to delete the object from the device
hr = content->Delete(PORTABLE_DEVICE_DELETE_NO_RECURSION,   // Deleting with no recursion
                                        objectsToDelete.Get(), // Object(s) to delete
                                        nullptr);

当我从命令行运行创建的批处理文件时,它可以工作,所以我不知道问题可能出在哪里。

【问题讨论】:

  • 您是否在任何地方使用相对路径?从程序而不是命令行运行时,批处理文件的 pwd 可能不同。
  • 您的进程/子进程是否在不同的安全上下文中运行?您是否收到有关删除失败原因的错误代码/消息?
  • @LB2 它不应该有任何不同的安全上下文,当我以管理员权限运行它时,它仍然不起作用。我没有任何错误代码或消息。
  • 为什么要创建和运行批处理文件而不是直接调用 C++ 程序?
  • @DropDropped “我没有任何错误代码或消息” - 你有办法从你发布的代码块中获取hr 的值吗?这将包含错误代码,可能会提供有关不幸性质的线索。

标签: c# c++ file batch-file visual-studio-2013


【解决方案1】:

这不是一个完整的答案,但所需的故障排除步骤不适合评论,因此作为答案(当更多信息来自 OP 时我会修改)

根据您发布的documentation 链接,如果第三个参数接收到一个指针而不是nullptr,那么它将包含特定的错误信息以防S_FALSE 返回。此信息与确定您遇到的故障原因有关。

以下是该调用中关于S_FALSE 含义的文档引用:

至少有一个对象无法删除。 ppResults 参数(如果指定)包含每个对象的错误代码。

请将您的代码修改如下:

// Attempt to delete the object from the device
IPortableDevicePropVariantCollection *pResults;
hr = content->Delete(PORTABLE_DEVICE_DELETE_NO_RECURSION,   // Deleting with no recursion
                                        objectsToDelete.Get(), // Object(s) to delete
                                        &pResults);

//TODO: Dump contents of pResults to log/cout/etc., in form objectsToDelete[i]=pResults[i]...

OP:请修改您的代码以捕获 ppResults,并使用该结构中的信息修改您的问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多