"Permission denied" 第二次打开文件写入时
"Permission denied" when opening file for writting second time
我正在 Windows 上使用 C++ 在 SFTP 模式下使用库 libssh 将文件从 Linux 传输到 windows。
我可以在 Windows 端创建一个文件并使用此程序写入一次:
int sftp_read_sync(ssh_session session, sftp_session sftp)
{
int access_type;
sftp_file file;
char* buffer[MAX_XFER_BUF_SIZE];
int nbytes, nwritten, rc;
int fd;
access_type = O_RDONLY;
file = sftp_open(sftp, "/root/bel1.txt",
access_type, 0);
if (file == NULL) {
fprintf(stderr, "Can't open file for reading: %s\n",
ssh_get_error(session));
return SSH_ERROR;
}
fd = open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC);
if (fd < 0) {
fprintf(stderr, "Can't open file for writing: %s\n",
strerror(errno));
return SSH_ERROR;
}
for (;;) {
nbytes = sftp_read(file, buffer, sizeof(buffer));
if (nbytes == 0) {
break; // EOF
} else if (nbytes < 0) {
fprintf(stderr, "Error while reading file: %s\n",
ssh_get_error(session));
sftp_close(file);
return SSH_ERROR;
}
nwritten = write(fd, buffer, nbytes);
if (nwritten != nbytes) {
fprintf(stderr, "Error writing: %s\n",
strerror(errno));
sftp_close(file);
return SSH_ERROR;
}
}
rc = sftp_close(file);
if (rc != SSH_OK) {
fprintf(stderr, "Can't close the read file: %s\n",
ssh_get_error(session));
return rc;
}
return SSH_OK;
}
再次在 运行 上运行同一个程序,我收到一个错误:
Can't open file for writing: Permission denied
创建的文件没有重写权限。
我该如何纠正?
你必须关闭文件句柄,一旦你写完:
close(fd);
当你不关闭句柄时,文件一直被进程锁定,直到进程退出,同时没有其他进程可以写入文件。
在 Windows 上,open() 已被弃用,您应该使用 _open(),或者更喜欢使用 _sopen_s()。
_open() 有一个可选参数 "int pmode" 允许您设置文件权限:
int _open(
const char *filename,
int oflag [,
int pmode]
);
对于pmode,可以指定
_S_IREAD
Only reading permitted.
_S_IWRITE
Writing permitted. (In effect, permits reading and writing.)
_S_IREAD | _S_IWRITE
Reading and writing permitted.
所以只需替换你的语句
fd = open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC);
和
fd = _open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC, _S_IREAD | _S_IWRITE);
你应该没问题。有关详细信息,请参阅 https://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx。
因为你在 Windows,你也可以使用 _sopen_s() 而不是 open()。 _sopen_s() 还允许指定文件权限。它的 API 不一样,看起来像
errno_t _sopen_s(
int* pfh,
const char *filename,
int oflag,
int shflag,
int pmode
);
根据https://msdn.microsoft.com/en-us/library/w64k0ytk.aspx,参数为
[out] pfh
The file handle, or -1 in the case of an error.
[in] filename
File name.
[in] oflag
The kind of operations allowed.
[in] shflag
The kind of sharing allowed.
[in] pmode
Permission setting.
所以你可以替换你的语句
fd = open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC);
和
int fd;
int err = _sopen_s( &fd, "C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC, _SH_DENYNO, _S_IREAD | _S_IWRITE );
if (err) {
fprintf( stderr, "Can't open file for writing: %s\n",
strerror( errno ) );
return errno;
}
参数的其他可能值在 https://msdn.microsoft.com/en-us/library/w64k0ytk.aspx 中详细记录。
最后,无论您使用_open() 还是_sopen_s(),您仍然应该关闭您的文件(然后,当文件已设置权限):
_close( fh );
最后,您将需要以下内容 headers:
#include <io.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <iostream>
#include <sys/stat.h>
#include <errno.h>
我正在 Windows 上使用 C++ 在 SFTP 模式下使用库 libssh 将文件从 Linux 传输到 windows。
我可以在 Windows 端创建一个文件并使用此程序写入一次:
int sftp_read_sync(ssh_session session, sftp_session sftp)
{
int access_type;
sftp_file file;
char* buffer[MAX_XFER_BUF_SIZE];
int nbytes, nwritten, rc;
int fd;
access_type = O_RDONLY;
file = sftp_open(sftp, "/root/bel1.txt",
access_type, 0);
if (file == NULL) {
fprintf(stderr, "Can't open file for reading: %s\n",
ssh_get_error(session));
return SSH_ERROR;
}
fd = open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC);
if (fd < 0) {
fprintf(stderr, "Can't open file for writing: %s\n",
strerror(errno));
return SSH_ERROR;
}
for (;;) {
nbytes = sftp_read(file, buffer, sizeof(buffer));
if (nbytes == 0) {
break; // EOF
} else if (nbytes < 0) {
fprintf(stderr, "Error while reading file: %s\n",
ssh_get_error(session));
sftp_close(file);
return SSH_ERROR;
}
nwritten = write(fd, buffer, nbytes);
if (nwritten != nbytes) {
fprintf(stderr, "Error writing: %s\n",
strerror(errno));
sftp_close(file);
return SSH_ERROR;
}
}
rc = sftp_close(file);
if (rc != SSH_OK) {
fprintf(stderr, "Can't close the read file: %s\n",
ssh_get_error(session));
return rc;
}
return SSH_OK;
}
再次在 运行 上运行同一个程序,我收到一个错误:
Can't open file for writing: Permission denied
创建的文件没有重写权限。
我该如何纠正?
你必须关闭文件句柄,一旦你写完:
close(fd);
当你不关闭句柄时,文件一直被进程锁定,直到进程退出,同时没有其他进程可以写入文件。
在 Windows 上,open() 已被弃用,您应该使用 _open(),或者更喜欢使用 _sopen_s()。
_open() 有一个可选参数 "int pmode" 允许您设置文件权限:
int _open(
const char *filename,
int oflag [,
int pmode]
);
对于pmode,可以指定
_S_IREAD
Only reading permitted.
_S_IWRITE
Writing permitted. (In effect, permits reading and writing.)
_S_IREAD | _S_IWRITE
Reading and writing permitted.
所以只需替换你的语句
fd = open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC);
和
fd = _open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC, _S_IREAD | _S_IWRITE);
你应该没问题。有关详细信息,请参阅 https://msdn.microsoft.com/en-us/library/z0kc8e3z.aspx。
因为你在 Windows,你也可以使用 _sopen_s() 而不是 open()。 _sopen_s() 还允许指定文件权限。它的 API 不一样,看起来像
errno_t _sopen_s(
int* pfh,
const char *filename,
int oflag,
int shflag,
int pmode
);
根据https://msdn.microsoft.com/en-us/library/w64k0ytk.aspx,参数为
[out] pfh
The file handle, or -1 in the case of an error.
[in] filename
File name.
[in] oflag
The kind of operations allowed.
[in] shflag
The kind of sharing allowed.
[in] pmode
Permission setting.
所以你可以替换你的语句
fd = open("C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC);
和
int fd;
int err = _sopen_s( &fd, "C:\Users\Wipro\Desktop\bel6.txt", O_WRONLY | O_CREAT | O_TRUNC, _SH_DENYNO, _S_IREAD | _S_IWRITE );
if (err) {
fprintf( stderr, "Can't open file for writing: %s\n",
strerror( errno ) );
return errno;
}
参数的其他可能值在 https://msdn.microsoft.com/en-us/library/w64k0ytk.aspx 中详细记录。
最后,无论您使用_open() 还是_sopen_s(),您仍然应该关闭您的文件(然后,当文件已设置权限):
_close( fh );
最后,您将需要以下内容 headers:
#include <io.h>
#include <stdio.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <iostream>
#include <sys/stat.h>
#include <errno.h>