本文目录一览:
- 1、fs.createWriteStream创建可写流
- 2、fdopen后还需要关原来的文件描述符么
- 3、Socket 编程中 close() 和 shutdown() 有什么区别?
- 4、文件描述符的特点
- 5、close的Linux 中的close函数
- 6、Python 文件操作
fs.createWriteStream创建可写流
options 还可以包括 start 选项,用于写入数据到文件开头之后的某个位置,允许的值在 [0, Number.MAX_SAFE_INTEGER ] 的范围内。
若要修改文件而不是覆盖文件,则需要 flags 选项被设置为 r+ 而不是默认的 w 。
encoding 可以是能被 Buffer 接受的任何一种字符编码。
如果 autoClose 被设置为 true(默认的行为),则当 'error' 或 'finish' 事件时,文件描述符会被自动地关闭。 如果 autoClose 为 false,则即使发生错误,文件描述符也不会被关闭。 应用程序需要负责关闭它并确保没有文件描述符泄漏。-文件描述符不close
默认情况下,流被销毁之后不会触发 'close' 事件。 这与其他 Writable 流的默认设置是相反的。 设置 emitClose 选项为 true 可以更改此行为。
与 ReadStream 一样,如果指定了 fd ,则 WriteStream 会忽略 path 参数,并且会使用指定的文件描述符。 这意味着不会触发 'open' 事件。 fd 必须是阻塞的,非阻塞的 fd 应该传给 net.Socket 。-文件描述符不close
如果 options 是字符串,则它指定字符编码。
例1:创建fs.WriteStream类的对象的时候,如果不传第二个参数,则默认options.flags为w,创建的可写流调用write方法写入数据的时候,会直接覆盖文件原所有的内容,
options.flags为'w',再设置start无效,因为没有意义,不管怎样写入的时候都会覆盖掉文件原内容
执行结果:
例2:如果要修改文件内容,而不是覆盖文件原内容,把options.flags设置为'r+',然后通过options.start设置从文件内容的哪个字节开始修改
执行结果:
例3:如果要把内容追加到文件原有的内容的后面,则设置flags为'a',此时设置start无效
执行结果:
fdopen后还需要关原来的文件描述符么
你可以这样做,但是没有必要。
因为 fd是指向你的打开的文件表项(每个打开的文件都有这么一表项),存在多个fd指向一个表项的情况(如你调用dup2,dup,fcntl),系统采用引用计数的方法,如你有两个fd指向一个文件表现,则计数为2,这样你每次调用close,引用计数减1,减到0是,销毁文件表项以及文件的vnode(inode结构)。即便你不手动关闭文件,进程结束时,系统会自动关闭你打开的文件,所以,试情况而定。有时你可以不必自己close文件。-文件描述符不close
Socket 编程中 close() 和 shutdown() 有什么区别?
一、指代不同
1、shutdown() :是指禁止在一个套接口上进行数据的接收与发送。
2、close():关闭一个套接口。更确切地说,它释放套接口描述字s,以后对s的访问均以WSAENOTSOCK错误返回。
二、原理不同
1、shutdown() :how参数为0,则该套接口上的后续接收操作将被禁止。这对于低层协议无影响。对于TCP协议,TCP窗口不改变并接收前来的数据(但不确认)直至窗口满。对于UDP协议,接收并排队前来的数据。任何情况下都不会产生ICMP错误包。-文件描述符不close
2、close():为对套接口的最后一次访问,则相应的名字信息及数据队列都将被释放。closesocket()的语义受SO_LINGER与SO_DONTLINGER选项影响。
三、特点不同
1、shutdown() :一个应用程序不应依赖于重用一个已被shutdown()禁止的套接口。特别地,一个WINDOWS套接口实现不必支持在这样的套接口上使用connect()调用。
2、close():如无错误发生,则closesocket()返回0。否则的话,返回SOCKET_ERROR错误,应用程序可通过WSAGetLastError()获取相应错误代码。
参考资料来源:百度百科-shutdown()
参考资料来源:百度百科-closesocket()
文件描述符的特点
文件描述符的好处主要有两个:
基于文件描述符的I/O操作兼容POSIX标准。
在UNIX、Linux的系统调用中,大量的系统调用都是依赖于文件描述符。
例如,下面的代码就示范了如何基于文件描述符来读取当前目录下的一个指定文件,并把文件内容打印至Console中。
此外,在Linux系列的操作系统上,由于Linux的设计思想便是把一切设备都视作文件。因此,文件描述符为在该系列平台上进行设备相关的编程实际上提供了一个统一的方法。
#include stdio.h
#include stdlib.h
#include string.h
#include unistd.h
#include sys/types.h
#include sys/stat.h
#include fcntl.h
int main(void){ int fd; int numbytes; char path[] = file; char buf[256]; /*
* O_CREAT: 如果文件不存在则创建
* O_RDONLY:以只读模式打开文件
*/
fd = open(path, O_CREAT | O_RDONLY, 0644);
if(fd 0){ perror(open());
exit(EXIT_FAILURE); } memset(buf, 0x00, 256);
while((numbytes = read(fd, buf, 255)) 0){ printf(%d bytes read: %s, numbytes, buf);
memset(buf, 0x00, 256);
} close(fd);
exit(EXIT_SUCCESS);} 文件描述符的概念存在两大缺点:
在非UNIX/Linux操作系统上(如Windows NT),无法基于这一概念进行编程。
由于文件描述符在形式上不过是个整数,当代码量增大时,会使编程者难以分清哪些整数意味着数据,哪些意味着文件描述符。因此,完成的代码可读性也就会变得很差。
close的Linux 中的close函数
头文件:
#include unistd.h
int close(int fd);
返回值:成功返回0,出错返回-1并设置errno
参数fd是要关闭的文件描述符。需要说明的是,当一个进程终止时,内核对该进程所有尚未关闭的文件描述符
调用close关闭,所以即使用户程序不调用close,在终止时内核也会自动关闭它打开的所有文件。但是对于一
个长年累月运行的程序(比如网络服务器),打开的文件描述符一定要记得关闭,否则随着打开的文件越来越
多,会占用大量文件描述符和系统资源。
应用于 Visual Basic 的 Close 语句
Close 语句:关闭Open语句所打开的输入/输出 (I/O) 文件。
语法
Close[filenumberlist]
可选的filenumberlist参数为一个或多个文件号,其中filenumber为任何有效的文件号,语法如下:
[[#]filenumber] [,[#]filenumber]. . .
说明
若省略filenumberlist,则将关闭Open语句打开的所有活动文件。
当关闭Output或Append打开的文件时,将属于此文件的最终输出缓冲区写入操作系统缓冲区。所有与该文件相关联的缓冲区空间都被释放。
在执行Close语句时,文件与其文件号之间的关联将终结。
Python 文件操作
open(filename[,mode,encoding="编码"]) :第一个参数文件名如果不加路径,默认在该py文件目录下(路径举例: E:/XXX或E:\\xxx ),第二个是模式,默认为 'r' ——只读,举例: f = open('E:/abc.txt') ,如果要转编码并写入模式:-文件描述符不close
f = open('E:/abc.txt','w',encoding='utf-8')
1. 模式
2. 方法
(1) close() : 关闭文件,因为文件写入时是写在内存,只有关闭时才写入硬盘,所以写完记得关闭
(2) read(size = -1) :读取文件size个字符,不写默认是-1,此时读取所有内容(换行按\n来表示,很不好看),并作为字符串返回,一定要注意 读完以后文件指针将会指向末尾 ,所以下一次在用read方法时会发现读取不出内容了,所以这个就要用seek移动指针或者关闭文件重新定义-文件描述符不close
(3) tell() :返回当前文件指针指向的位置
(4) seek(offset,from) :移动文件指针,代表从from参数开始偏移offset个字节,0代表起始位置,1代表当前位置,2代表文件末尾
(5) readline() :按序列读取一行内容,默认\n为边界
(6) write() :写入内容,但必须要有写入权限才行,否则报错,写完会返回写入的长度,例如: len1 = f.write('abc') ,此时len1就为3
(7) truncate() :删除内容,把当前指针以后的内容全删了,举例:
注:
1.文件还可以转化为 list 之类的,例如: list1 = list(f) ,此时文件内容的按\n被隔开,然后可以用for语句读取文件所有内容,举例:
2.上面输出文件内容方法相对低效,所以一般都直接用for输出整个文件,举例:
通过 fileno 函数,我们可以查看一个文件对应的文件描述符,对应的是程序中打开的文件序号,举例:
可以看出python在启动时会先启动标准流的文件(文件描述符分别为:0/1/2),所以之后打开的文件就从3开始递增,当释放一个文件资源时,该描述符序号被释放,之后打开的文件可以继续使用该序号的文件描述符-文件描述符不close
python中的 print 的本质是通过 sys.stdout 来进行内容输出,而 sys.stdout 的本质是一个"文件",相当于我们所有的输入输出的本质都是在对 sys.stdin / sys.stdout / sys.stderr 这些文件来进行读写操作,举例:-文件描述符不close
open 函数不仅可以打开本地文件,也可以打开文件描述符,而该参数默认为 True ,代表 close 后会将对应的文件资源释放,而对于一些文件描述符,我们只是希望 close 时将打开文件描述符的对象释放,而不释放对应的文件资源,那么则可以设置 closefd=False ,举例:-文件描述符不close
需要使用到 chardet 模块,按二进制可读打开文件,然后通过 detect() 方法查看,举例:
所以就可以根据文件来设置编码了:
有时候使用文件的编码解码也可能会出现无法解析的情况,例如两种编码混在同一个文件里的时候,此时可以设置 errors 参数为 ignore 来避免该问题,示例:
可用 os 模块下的 chmod() 函数,具体参考:
使用 os 模块下的 remove() 函数可以实现删除文件,举例:
可以使用自带的 zipfile 模块来进行操作,举例:
可以使用自带的 tarfile 模块来进行操作,举例: