当我在我的代码上运行ReSharper时,例如:
if (some condition)
{
Some code...
}
Run Code Online (Sandbox Code Playgroud)
ReSharper给了我上面的警告(反转"if"声明以减少嵌套),并提出了以下更正:
if (!some condition) return;
Some code...
Run Code Online (Sandbox Code Playgroud)
我想明白为什么那样更好.我一直认为在方法中间使用"返回"有问题,有点像"goto".
我有两个问题,第一个问题已经解决了.
当前问题
如果我嵌入了一个需要加载库的文件,例如jpeg图像或mp3音乐,我将需要使用该文件作为库的输入.但是,每个库都是不同的,并使用一种方法来获取文件作为输入,输入可以是文件名或FILE*指针(来自libc的文件界面).
我想知道如何访问带有名称的嵌入式文件.如果我创建一个临时文件,那将是低效的,还有另外一种方法吗?我可以将文件名映射到内存吗?我的平台是Windows和Linux.
如果show_file(const char*name)是库中的函数,我将需要一个字符串来打开该文件.
我已经看到了这些问题:
如何在内存中获取缓冲区的文件描述符?
从C中的文件描述符获取文件名
以下代码是我的解决方案.这是一个好的解决方案吗?它效率低下吗?
# include <stdio.h>
# include <unistd.h>
extern char _binary_data_txt_start;
extern const void* _binary_data_txt_size;
const size_t len = (size_t)&_binary_data_txt_size;
void show_file(const char* name){
FILE* file = fopen(name, "r");
if (file == NULL){
printf("Error (show_file): %s\n", name);
return;
}
while (true){
char ch = fgetc(file);
if (feof(file) )
break;
putchar( ch );
}
printf("\n");
fclose(file);
}
int main(){
int fpipe[2];
pipe(fpipe);
if( !fork() ){
for( int buffsize = len, done …Run Code Online (Sandbox Code Playgroud) 我需要从我编写的一个小型Linux内核模块中获取给定文件描述符中的文件名.我尝试了在C中从文件描述符获取文件名时给出的解决方案,但由于某种原因,它打印出垃圾值(在解决方案中提到的使用readlink时/proc/self/fd/NNN).我该怎么做?
可能重复:
从C中的文件描述符
获取文件名从C中的文件指针获取文件名
我在这里有一个功能:
handle_file(FILE *file)
{
if(condition)
{
print filename and other msg;
}
}
Run Code Online (Sandbox Code Playgroud)
我们在这里唯一知道的是指向文件的指针; 是否可以根据指针获取文件名?
可能重复:
从C中的文件描述符获取文件名
是否有一种简单且(合理)可移植的方式从文件中获取文件名FILE*?
我使用打开文件f = fopen(filename, ...),然后传递f给其他各种函数,其中一些可能会报告错误.我想在错误消息中报告文件名,但避免传递额外的参数.
我可以创建一个自定义包装器struct { FILE *f, const char *name },但是可能有更简单的方法吗?(如果FILE*未打开使用fopen我不关心结果.)
从C中的文件描述符获取文件名的问题的变体.这是关于Linux的.
如果我有一个引用常规文件的文件描述符,我可以通过给它一个新的文件名"保存"文件描述符(当然,它在同一设备上的某个地方)?我正在寻找类似于重命名(2)或链接(2)的东西,但是它会接受文件描述符作为输入而不是文件名.
重命名(2)和链接(2)的问题在于,即使您可以尝试从文件descritor转到文件名,这可能会失败.我正在更准确地考虑打开的文件描述符引用已经取消链接的文件的情况 - 在这种情况下,文件没有更多名称.当我们关闭()文件描述符时,似乎无法阻止文件被删除.但我错了吗?我们可以使用Posix甚至是Linux API再次命名吗?
更新:我们实际上可以在Linux上看到已删除文件的内容/proc/<pid>/fd/<fd>,即使它看起来像一个破损的符号链接.但是,我们不能使用link(2)或ln(1)来重新实现这样的文件,因为它认为我们正在尝试进行跨设备链接.
我有一个int早先打开的文件描述符(via open),我需要删除该文件.
我真的必须先获取文件名并打电话remove吗?(例如,通过使用C中的文件描述符获取文件名中的技术)
或者是否有其他(linux特定的OK)方式完全基于文件描述符?
我搜索过,我能找到的最好的是上面的答案.
假设我有一个已打开文件的列表(实际上是文件编号):
import resource
import fcntl
def get_open_fds():
fds = []
soft, hard = resource.getrlimit(resource.RLIMIT_NOFILE)
for fd in range(3, soft):
try:
flags = fcntl.fcntl(fd, fcntl.F_GETFD)
except IOError:
continue
fds.append(fd)
return fds
Run Code Online (Sandbox Code Playgroud)
现在我想获取这些文件的名称.我怎样才能做到这一点?
只是为了澄清,对于那些低估这个:fd是一个整数.它不是文件描述符.很抱歉让您对名称感到困惑,但代码不言自明.
我对此感到愤怒,我认为是因为我选择了fd文件编号.我刚检查了文档:
此模块中的所有函数都将文件描述符fd作为其第一个参数.这可以是整数文件描述符,例如sys.stdin.fileno()返回的文件描述符,也可以是文件对象,例如sys.stdin本身,它提供了一个返回真正文件描述符的fileno().
所以fd确实是一个整数.它也可以是文件对象,但在一般情况下,fd它没有.name.
在不区分大小写的文件系统(如NTFS或HFS +)上,给定文件名,确定文件名的大小写保留版本的最有效方法是什么?
考虑一下HFS +(Mac OS X):
> perl -E 'say "yes" if -e "/TMP"'
yes
Run Code Online (Sandbox Code Playgroud)
它说它存在,当然,但我不知道它的情况是如何保留的.确定实际案例的最有效方法是什么?
到目前为止我尝试过的:
glob 使用字符类:它在Windows上不起作用:
> perl -E "say for glob "C:\\Perl"
C:\Perl
> perl -E "say for glob "C:\\[Pp][Ee][Rr][Ll]"
Run Code Online (Sandbox Code Playgroud)
注意最后一个命令缺少输出.:-(
opendir/ readdir:工作,但读取整个目录似乎效率很低:
> perl -E "opendir my $dh, 'C:\\'; say for grep { lc $_ eq 'perl' } readdir $dh; close $dh"
Perl
Run Code Online (Sandbox Code Playgroud)认为应该有一些核心操作系统指令或某些东西可以更有效地获取这些信息,这是不是很疯狂?
在红宝石......
我有一个由外部进程创建的IO对象,我需要从中获取文件名.但是我似乎只能得到文件描述符(3),这对我来说不是很有用.
有没有办法从这个对象获取文件名甚至获取文件对象?
我从通知程序获取IO对象.所以这可能是一种获取文件路径的方法?