VC ++ CLI / CLR通过网络删除文件/文件夹

时间:2011-03-19 01:55:58

标签: visual-c++ file io

我希望从网络PC中删除文件。用户可以完全控制PC上用于删除文件的共享文件夹。 我有这段代码:

if(status)
        {
            if(File::Exists(selectedfile))
                System::IO::File::Delete(selectedfile);
            else
                MessageBox::Show("File does not exist.");

        }
        else
        {   
            if(!System::IO::Directory::Exists(selectedfile))
                MessageBox::Show("The directory does not exists.");
            try{
                System::IO::Directory::Delete(selectedfile,true);
                if(System::IO::Directory::Exists(selectedfile))
                {
                    deleted =false;
                    System::IO::Directory::Delete(selectedfile,true);
                }
                else
                    deleted = true;
            }

我在Directory循环中包含了第二个删除,因为首次尝试时不删除该文件夹,只删除该文件夹中的文件。但是,每当我尝试删除空文件夹时,我都会拒绝访问。

如何确保删除目录及其所有内容。

2 个答案:

答案 0 :(得分:1)

这很常见,是多任务操作系统需要做的事情之一。该目录实际上已标记为删除,但由于一个或多个进程在目录上打开了句柄,因此无法将其删除。在Windows的情况下,这通常是使用该目录作为其默认工作目录的过程。或者你可能已经打开了一个资源管理器窗口,看看你的程序是如何工作的。 Explorer使用ReadDirectoryChangesW()来获取有关目录更改的通知,以便知道何时刷新视图。

最后一个句柄关闭后,目录将从驱动器中物理移除。虽然它存在于这种僵尸状态,但任何对目录执行任何操作的尝试都将产生访问错误(Windows错误代码5)。

您需要在程序中考虑此行为。绝对删除第二个Directory :: Exists()测试,当您没有从Delete调用中获得异常时,您需要假设该目录已被删除。这最终将是准确的。

答案 1 :(得分:0)

您需要在计算机A和B上使用文件服务器功能,并在计算机C上编写客户端。

  • 服务器可以是一种FTP服务器,您必须明确配置在两个站点上处理哪些目录。

  • 服务器可以是Windows共享。您可以使用UNC文件名来处理这些文件并在计算机C上使用Windows API。当您在计算机C上映射网络驱动器时,您可以像处理本地文件一样使用网络文件。
    必须配置计算机A和B,以便共享具有足够权限。