检查文件仅包含空字节


12

您的目标是编写一个程序或函数,该程序或函数接受代表文件路径的字符串作为输入,并在该文件不为空且不包含非空字节的情况下输出真实值-即所有位均为0- -否则为假值。

我意识到这是一个非常简单的问题,我想我可以破解一些东西,但是我怀疑必须有一些简短而优雅的方法来做,这给了我一个挑战的想法。

这是,因此以字节为单位的最短代码获胜。(我个人倾向于使用最快的解决方案,但这也取决于实现方式...)

相关问题用零填充文件

动机这只是为了告诉您问题出在哪里,以防您感兴趣。您不需要阅读它。

用“ dd”或其他方式复制的CD和DVD的ISO映像通常以仅包含空字节的无用块序列终止。删除这些块的标准技术是已知且简单的(请参阅 /unix/74827/),但是它们有时可能会删除非null有用的数据,因为介质的大小可能取决于其自身大小。因此,我想检查已删除的块是否仅包含空字节。删除这些块对于定义ISO映像的规范化版本很重要。

Answers:


5

Pyth,6个 5字节

!sCM'

在线尝试!

从STDIN中获取文件名,打开并读取文件,将其转换为ints(认为Python ordsums列表(0如果文件全为空字节,则返回),然后not将结果打印出来。


嘿,

这看起来很像一个一般的编程问题。这些属于堆栈溢出。但是,从主要帖子下的评论中,我可以看到这不是您的意图。就是说,我觉得双方的讨论都不必要地充满敌意,所以我决定放松一下,并给您适当的PPCG欢迎!

通常,我们要求首先将任何挑战发布到我们的沙盒中以获取适当的反馈。您可以查看其中的当前提交内容,以了解我们更喜欢挑战的格式。请下次再试!

以防万一我们都误解了您,并且您寻找一般的解决方案,以下是Python 3中的解决方案:

def main(string):
    with open(string) as file:
        return not any(map(ord,file.read()))

1
由于功能强大,因此不适用于仅由黑色像素(零)组成的灰度图像'
user202729

此外:OP要求使用命令行参数将文件名作为输入,并作为状态码返回。
user202729

2

GNU sed -zn,5个字节

输入文件作为命令行参数传递给sed。输出为标准外壳返回码-即0为TRUE,1为FALSE。

/./q1

通常sed适用于以换行符分隔的输入记录(又称“行”)。 -z将其更改为以nul分隔的输入记录。如果有任何输入记录与.正则表达式匹配,则q使用退出代码为1的uit。

在线尝试!


2

DOS,37个字节


100:BE 80 00 MOV SI, 0080
103:AD       LODSW ;get command-line length
104:98       CBW ;only a byte
105:93       XCHG BX,AX
106:88 40 FF MOV [BX+SI-01], AL ;zero end of name
109:B4 3D    MOV AH, 3D
10B:89 F2    MOV DX, SI
10D:CD 21    INT 21 ;open file
10F:93       XCHG BX, AX ;handle into BX
110:AF       SCASW ;DI=0
111:B4 3F    MOV AH, 3F
113:B1 01    MOV CH, 01
115:CD 21    INT 21 ;read 1 byte
117:91       XCHG CX, AX
118:E3 06    JCXZ 0120 ;quit on EOF
11A:97       XCHG DI, AX ;set true for later
11B:38 2C    CMP [SI], CH
11D:74 F2    JZ 0111 ;loop while zero
11F:4F       DEC DI ;set false
120:97       XCHG DI, AX
121:B4 4C    MOV AH, 4C ;return
123:CD 21    INT 21

它打开在命令行上命名的文件,如果为空或包含非零,则返回0,否则返回1。


1

附件,24字节

Zero@Max&0@Ords@FileRead

在线尝试!

说明

这是由4个函数组成的,一个接一个地执行:

  • FileRead -以文件名作为输入,返回该文件的内容
  • Ords -返回列表中每个字符的ASCII码点
  • Max&0-对于参数x,这等效于Max[x, 0];这反过来计算在最大所有条目x0(产生0的空列表)
  • Zero -这是一个谓词,用于检查该数字是否实际上为0,并返回该布尔值。

OP需要完整的程序,可从命令行调用,使用参数将文件名作为输入,并作为状态码返回。(@_@
user202729

这不是对空文件的错误肯定吗?
ngenisis

1
@ngenisis原始问题如下:“这意味着空文件被认为是可以的” –检查修订历史记录,似乎某个用户编辑了该问题。
科纳·奥布赖恩

1

C(32位平台),65字节

main(x,v)int*v;{for(v=fopen(v[1],"r");!(x=fgetc(v)););return++x;}

假设指针的大小都相同,这几乎总是正确的。0成功时返回退出代码(文件仅包含NUL字符),否则返回其他值。

如果命令行参数不是可读文件的路径,则行为是不确定的。


我觉得你需要写int**v吗?如果不这样做,我就找不到不会出现段错误的编译器。另外,您可以通过故意出错来节省一些时间,但是我不知道这是否是最好的方法。
FryAmTheEggman

??我在mingw32上用gcc尝试过,工作正常。我可能应该添加约束sizeof(void*) == sizeof(int)(或更普遍的说是“ 32位平台”),然后在amd64平台上,尝试使用-m32;进行编译
Felix Palmen

@FryAmTheEggman在编译为32位代码(-m32)时也可以在TIO上工作:在线尝试!
Felix Palmen '18

嗯当然了 好好工作!随意使用我的建议保存几个字节:)
FryAmTheEggman '18

0

Bash + GNU实用程序,26个字节

od -An $1|grep -qv [^0\ *]

输入文件名作为命令行参数给出。输出为标准外壳返回码-即0为TRUE,1为FALSE。

在线尝试!


0

Wolfram语言(Mathematica),30个字节

BinaryReadList@#~MatchQ~{0..}&

在线尝试!

说明

                             & (* Function which returns whether *)
BinaryReadList                 (* the list of bytes *)
              @                (* of *)
               #               (* the input *)
                ~MatchQ~       (* matches *)
                        {0..}  (* a list of a one or more zeros *)

备用解决方案,22字节

如果应该传递空文件,则可以将其缩短为:

Tr@BinaryReadList@#<1&

在线尝试!


0

Java,149字节

boolean b(String f)throws Exception{java.io.InputStream s=new java.io.FileInputStream(f);int i=Math.abs(s.read());while(i==0)i+=s.read();return i<0;}

0

Perl 5,20个字节

$\=0;exit<>=~/^\0+$/

在命令行args中获取文件名,并在程序的退出代码中返回响应


0

Python 3,59个字节

f=lambda s:any(open(s,'rb').read())+not len(open(s).read())

成功返回0(所有字节为零)。

对于失败返回1(至少一个非零字节或零长度文件)。


如果文件为空,则必须返回失败。
亚当

0

APL(Dyalog Unicode),14个字节

完整程序。提示输入来自stdin的文件名。

0=⌈/11 ¯1MAP

在线尝试!

 提示输入文件名

11 ¯1⎕MAP 将该文件映射到打包的位数组

⌈/ 最大(减少);最小浮点数(如果为空),否则为0或1

0= 零等于那个吗?


0

Haskell,49个字节

import Data.ByteString
f=(all(<1)<$>).getContents

显然,如果不包括导入,则为26个字节。


我想你是readFile故意的getContets。我认为您可以将文件作为普通的String读取,进行比较=='\0'(或更好<'\1')并摆脱import。由于您可以使用匿名函数,因此可以删除f x=和去点化:(all(<'\1')<$>).readFile
nimi

如果是二进制文件,则不能使用readFile,当遇到无效的Unicode序列时,它将引发异常。关于毫无意义的好点。
Izaak Weiss

0

JavaScript(ES8),52个字节

将url作为参数,并返回一个承诺,可以解决true文件是否为空且不包含空字节的情况。

async p=>!/\0|^$/.test(await(await fetch(p)).text())

0

Zsh,35个字节

! for c (${(s::)"$(<$1)"})((i|=#c))

在线尝试!通过退出代码输出。

读入,拆分字符,然后按位或每个代码点一起。

如果文件为空,则循环主体永远不会运行,因此循环返回true。如果可以交换真假值,则!可以删除前导以节省2个字节。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.