- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在尝试制作一个复制程序,允许我将文件从当前目录复制到另一个目录。到目前为止,我正在使用 open()、creat()、read()、write()。
例如:到目前为止,我只能将文件复制到当前目录。
我有一个文件夹名称 A_folder 和一个文件名称 file_1 我想将 file_1 从我当前目录复制到 A_folder .
有人可以帮帮我吗?
代码和图片如下所示
我现在能做的:./copy file1 copy_file
我想要的是:./copy file1 ./folder copy_file
最佳答案
当给定 A_folder
和 file_1
时,您需要一个辅助函数来构造您需要的路径 A_folder/file_1
。
这种函数的一个典型例子是
char *combine_path(const char *dir, const char *name)
{
/* Calculate the lengths of the path components.
If the respective parameter is NULL, the length is zero .*/
const size_t dirlen = (dir) ? strlen(dir) : 0;
const size_t namelen = (name) ? strlen(name) : 0;
char *path, *p;
/* We allocate <dir> + '/' + <name> + '\0'. */
path = malloc(dirlen + namelen + 2);
if (!path) {
errno = ENOMEM;
return NULL;
}
/* Let p point to the current position in the
resulting path. */
p = path;
/* If there is a directory part,
copy it, and append a '/' after it. */
if (dirlen > 0) {
memcpy(p, dir, dirlen);
p += dirlen;
*p = '/';
p += 1;
}
/* If there is a name part, copy it. */
if (namelen > 0) {
memcpy(p, name, namelen);
p += namelen;
}
/* Append a NUL char, '\0', to terminate the
dynamically allocated buffer.
This turns it into a C string. */
*p = '\0';
/* Return the pointer to the dynamically-allocated
memory, containing the concatenated paths
as a single string. */
return path;
}
请注意,上述函数返回一个动态分配的副本,因此您应该在不再需要时free()
该结果。
我更喜欢更明确的错误检查。考虑:
int copy_file(const char *frompath, const char *topath)
{
struct stat frominfo, toinfo;
char data[BUFFERSIZE];
ssize_t n;
int src, dst, cause;
if (!frompath || !*frompath ||
!*topath || !*topath) {
fprintf(stderr, "copy_file(): NULL or empty file name!\n");
return errno = EINVAL;
}
src = open(frompath, O_RDONLY | O_NOCTTY);
if (src == -1) {
cause = errno;
fprintf(stderr, "%s: Cannot open file: %s.\n", frompath, strerror(cause));
return errno = cause;
}
if (fstat(src, &frominfo) == -1) {
cause = errno;
fprintf(stderr, "%s: Cannot get file statistics: %s.\n", frompath, strerror(cause));
return errno = cause;
}
dst = open(topath, O_WRONLY | O_CREAT | O_EXCL, frominfo.st_mode & 0777);
if (dst == -1) {
cause = errno;
fprintf(stderr, "%s: Cannot create file: %s.\n", topath, strerror(saved_errno));
errno = cause;
}
while (1) {
char *p, *q;
n = read(src, buffer, sizeof buffer);
if (n == 0) {
/* End of input. */
cause = 0;
break;
} else
if (n < 0) {
/* Error (or interrupt, EINTR). */
if (n == -1)
cause = errno;
else
cause = EIO; /* n < -1 is a bug. */
fprintf(stderr, "%s: Read error: %s.\ņ", frompath, strerror(cause));
break;
}
p = buffer;
q = n;
cause = 0;
while (p < q) {
n = write(dst, p, (size_t)(q - p));
if (n > 0)
p += n;
else
if (n == -1) {
cause = errno;
break;
else {
/* Bug; should never occur. */
cause = EIO;
break;
}
}
if (cause) {
fprintf(stderr, "%s: Write error: %s.\n", topath, strerror(cause));
break;
}
}
/* Failed? */
if (cause) {
unlink(topath);
return errno = cause;
}
if (fstat(dst, &toinfo) == -1) {
cause = errno;
fprintf(stderr, "%s: Cannot get file information: %s.\n", topath, strerror(cause));
unlink(topath);
return errno = cause;
}
/* from may be a device; if so, its size
will be zero. */
if (frominfo.st_size > 0 &&
frominfo.st_size != toinfo.st_size) {
cause = EIO;
fprintf(stderr, "%s: File size mismatch!\n", topath);
unlink(topath);
return errno = cause;
}
/* Careful closing. */
if (close(src) == -1) {
cause = errno;
fprintf(stderr, "%s: Error closing file: %s.\n", frompath, strerror(cause));
unlink(topath);
return errno = cause;
}
if (close(dst) == -1) {
cause = errno;
fprintf(stderr, "%s: Error closing file: %s.\n", topath, strerror(cause));
unlink(topath);
return errno = cause;
}
/* Success. */
return errno = 0;
}
请注意我如何使用 p
和 q
指针将读取缓冲区内容写入可能不止一个部分的模式。如果源文件是本地的,而目标文件位于某个不稳定的文件系统上,则可能会发生这种情况。没有要求 write()
应该写入整个缓冲区或返回错误代码;短写——只写入给定缓冲区中的一些初始数据——是完全可以的,并且在某些情况下确实会发生。以上是我处理这些问题的首选方式。
许多人考虑这种级别的错误检查——特别是检查 close()
的结果值,因为在这个时间点许多操作系统(包括 Linux)从不返回错误——愚蠢或者至少是偏执狂。
我个人认为这种错误检查“稳健”,因为我希望我的代码能够告诉我,作为用户,如果发生了任何不幸的事情;我绝对不希望它只是假设一切顺利,我希望它对此偏执。 (我并不是说 OP 的代码不检查错误代码;我只是说这个版本更加谨慎和直言不讳。)
关于c - Unix:将文件从当前目录复制到 C 中的另一个目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43660314/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!