首页 > 其他分享 >11.1 文件拷贝移动与删除

11.1 文件拷贝移动与删除

时间:2023-11-19 09:46:41浏览次数:36  
标签:文件 删除 dest 11.1 char BOOL file 拷贝 目录

在编程中,针对磁盘与目录的操作也是非常重要的,本章将重点介绍如何实现针对文件目录与磁盘的操作方法,其中包括了删除文件,文件拷贝,文件读写,目录遍历输出,遍历磁盘容量信息,磁盘格式化,输出分区表数据,监控目录变化等。

11.1 CopyFile

CopyFile 函数,用于将一个文件从一个位置复制到另一个位置,该函数原型为:

BOOL CopyFile(
  LPCWSTR lpExistingFileName,
  LPCWSTR lpNewFileName,
  BOOL    bFailIfExists
);

其中,lpExistingFileName 表示要复制的文件名,lpNewFileName 表示复制后的新文件名,bFailIfExists 表示如果新文件名已经存在是否覆盖。如果成功复制文件,则返回非零值。如果失败,则返回零。

#include <iostream>
#include <Windows.h>

// 判断是否为目录
BOOL isDirectory(char* path)
{
  WIN32_FIND_DATA fd;
  BOOL rel = FALSE;
  char* p = path;

  // 查找到第一个文件的句柄
  HANDLE hFind = FindFirstFile(path, &fd);

  while (*p != '\0') p++;

  // 如果结尾是这两种符号就肯定是目录
  if (*(--p) == '\\' || *(p) == ' / ')
  {
    *p = '\0';
    return TRUE;
  }
  // 判断是否获取错误
  if (hFind != INVALID_HANDLE_VALUE)
  {
    // 文件信息按位与上目录属性, 非目录则全部置零
    if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
      rel = TRUE;
    }
    // 关闭查找句柄
    FindClose(hFind);
  }
  return rel;
}

int main(int argc, char* argv[])
{
  char file_src[MAX_PATH] = { 0 };
  char file_dest[MAX_PATH] = { 0 };

  strcpy(file_src, "d://lyshark.exe");
  strcpy(file_dest, "d://");

  if (isDirectory(file_dest))
  {
    // 如果第二个参数是目录,则拼装新的文件路径
    sprintf(file_dest, "%s\\%s", file_dest, file_src);
  }

  if (CopyFile(file_src, file_dest, 0) == 0)
  {
    printf("文件复制失败 \n");
  }
  else
  {
    printf("文件已复制 \n");
  }

  system("pause");
  return 0;
}

11.2 MoveFile

MoveFile 函数,用于将文件从一个位置移动到另一个位置,该函数可以用于重命名文件或将文件从一个目录移动到另一个目录。如果要在同一目录中重命名文件,可以将文件的新名称作为 lpNewFileName 参数提供,而 lpExistingFileName 参数应保持不变。如果要移动文件到另一个目录,可以提供新目录的路径和名称作为 lpNewFileName参数,该函数原型如下所示;

BOOL MoveFile(
  LPCTSTR lpExistingFileName,
  LPCTSTR lpNewFileName
);

其中,lpExistingFileName 是要移动的文件的完整路径和名称,lpNewFileName 是文件的新路径和名称。如果文件成功移动,则函数返回非零值,否则返回零,读者需要注意,该函数只能移动文件,无法移动文件夹。如果要移动文件夹,可以使用 MoveFileEx() 函数。

#include <iostream>
#include <Windows.h>

// 判断是否为目录
BOOL isDirectory(char* path)
{
  WIN32_FIND_DATA fd;
  BOOL rel = FALSE;
  char* p = path;

  // 查找到第一个文件的句柄
  HANDLE hFind = FindFirstFile(path, &fd);

  while (*p != '\0') p++;

  // 如果结尾是这两种符号就肯定是目录
  if (*(--p) == '\\' || *(p) == ' / ')
  {
    *p = '\0';
    return TRUE;
  }
  // 判断是否获取错误
  if (hFind != INVALID_HANDLE_VALUE)
  {
    // 文件信息按位与上目录属性, 非目录则全部置零
    if (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
    {
      rel = TRUE;
    }
    // 关闭查找句柄
    FindClose(hFind);
  }
  return rel;
}

int main(int argc, char* argv[])
{
  char file_src[MAX_PATH] = { 0 };
  char file_dest[MAX_PATH] = { 0 };

  strcpy(file_src, "d://lyshark.exe");
  strcpy(file_dest, "d://lyshark");

  if (isDirectory(file_dest))
  {
    // 如果第二个参数是目录, 则拼装新的文件路径
    sprintf(file_dest, "%s\%s", file_dest, file_src);
  }

  if (MoveFile(file_src, file_dest) == 0)
  {
    printf("文件剪切失败 \n");
  }
  else
  {
    printf("文件剪切成功 \n");
  }

  system("pause");
  return 0;
}

11.3 DelteFile

DeleteFile 函数用于删除指定的文件,该函数位于windows.h头文件中,此函数只能用于删除文件而无法删除目录,如果需要删除目录则需要使用RemoveDirectory来实现,该函数原型如下:

BOOL DeleteFile(
LPCTSTR lpFileName
);

其中,lpFileName 参数是一个指向以 NULL 结尾的字符串,表示要删除的文件名,可以是绝对路径或相对路径,函数执行成功时返回 TRUE,否则返回 FALSE,如果删除失败则可以调用GetLastError()得到失败代码。

#include <iostream>
#include <Windows.h>

int main(int argc, const char* argv[])
{
  // 如果非零则删除失败
  if (!DeleteFile("d://lyshark.exe"))
  {
    printf("删除文件错误:%x \n", GetLastError());
  }

  system("pause");
  return 0;
}

标签:文件,删除,dest,11.1,char,BOOL,file,拷贝,目录
From: https://www.cnblogs.com/LyShark/p/17841611.html

相关文章

  • 11.18日记
    学习开发记录:文件的下载还有问题@GetMapping("/download/{fileName}")publicvoiddownload(@PathVariableStringfileName,HttpServletResponseresponse)throwsIOException{StringfilePath=ROOT_PATH+File.separator+fileName;System.out.println(filePath);......
  • misc 2023.11.13-11.19
    1.a.将其拖入010中,发现有一串二进制b.我们考虑是不是什么解密,将二进制转换为16进制再转为asciic.得到flag{koekj3s} 2.a.暴力破解,解压文件b.解密之后发现一个奇怪的玩意,经过资料搜索,这是brainfuck代码c.使用解密工具: 3.a.用wireshark打开文件,过滤出HTTP数据包......
  • 2023.11.18 日记
    今天noip打烂了。具体的都在文章里写过了。父亲几年来一直在备考,CSP-S2的那天他刚好考完。最近他轻松了很多。我们家也轻松了好多。所以最近都是他接送我。几个月前他听说我精神状态不佳,他说,要保持一个很严格的生物钟。这正是我所希冀的。他一直保持着很好的生活习惯,他讨......
  • 2023.11.18——每日总结
    学习所花时间(包括上课):9h代码量(行):0行博客量(篇):1篇今天,上午学习,下午学习;我了解到的知识点:1.mybatis明日计划:学习......
  • 11.17~11.18暨noip2023游寄
    11.17我们DZ不负众望又干了点nt事,但是为了按时间顺序记叙,所以说放到最后再讲上午平常的起床+吃饭,然后就发手机啥的,坐大巴去德州东再坐会高铁去秦皇岛,这些简单记一下就行了重点来了先拜谢一下__int_R__在大巴上的时候tkth拉int_R回粥,然后他在自己号整了几抽出了个6星,又在tkth......
  • crypto 2023.11.13-11.19
    1.a.直接用python跑。b.得到flag,此flag为16进制,需要转换为字符串。c.得到flag 2.a.直接爆破猜解:b.得到flag 3.a.直接暴力猜解b.得到flag 4.a.直接使用工具解码b.得到flag 5.a.用python工具解密b.得到10进制的flag,将其转换为16进制,再转换为字符串......
  • 2023.11.18 鲜花
    第一篇鲜花。因为一般想写鲜花的时候都写不了鲜花,在脑子删删补补完了之后已经懒得写了。然后接下来是有针对性的内容。您发个鲜花,我是认真看完了,我真的感动了,我写不出啥话,「最感人的一集」可能听起来有贬义,但我第二条评论很明显都澄清了啊,这纯纯的正面评价啊。我平时说话冲,是这......
  • 2023.11.18 NOIP 游记
    2023.11.18NOIP游记Day-1一大早吃完饭就出发了。路上在摆,想放松一下,只求正常发挥。还是有点紧张,夹杂九分伤心。毕竟已经觉得自己要退了。午饭自助,但是随便吃了两口。心情挺沉重的。一想到是我最后一次比赛了,还是很,,,下午去听了个会,颁奖仪式没听,感觉没啥意思,学长讲话略微听......
  • 2023.11.18
    十一月这半个月陆陆续续学了一些c语言的语法,跟着教程做了几个小项目,不过最近结课科目有点多,还有考试,学习进度也相应放缓了,争取12月上旬可以结束掉c语言的学习,开始学习c++的内容,后面再学习计算机其他几门核心课程。......
  • go map删除元素后内存是否会释放
    go底层map是由若干个bmap(桶)构成的,桶只会扩容,不会缩容,所以map中占用的内存不会被释放但是!!!以上只针对值类型的数据结构例如:基本类型intstringslicestruct等如果key为指针变量删除后这个指针变量内存不会释放,但是这个指针指向的对象,引用计数会-1如果引用......