【发布时间】:2018-01-23 16:05:34
【问题描述】:
在 C# 中查看内存映射文件时,很难确定如何快速向前和向后搜索文件。我的目标是用语言重写以下函数,但找不到像下面使用的 find 和 rfind 方法。 C# 中有没有一种方法可以使用特定的子字符串快速搜索内存映射文件?
#! /usr/bin/env python3
import mmap
import pathlib
# noinspection PyUnboundLocalVariable
def drop_last_line(path):
with path.open('r+b') as file:
with mmap.mmap(file.fileno(), 0, access=mmap.ACCESS_READ) as search:
for next_line in b'\r\n', b'\r', b'\n':
if search.find(next_line) >= 0:
break
else:
raise ValueError('cannot find any line delimiters')
end_1st = search.rfind(next_line)
end_2nd = search.rfind(next_line, 0, end_1st - 1)
file.truncate(0 if end_2nd < 0 else end_2nd + len(next_line))
【问题讨论】:
-
对于发育迟缓的 Python,您能描述一下您真正想要实现的目标吗?是否只是查找给定文件是否包含某个字符串?
-
@Jamiec 不,它正在尝试删除 CSV 文件的最后一行,其中每行都以行分隔符终止。以下问题有不可接受的解决方案,因为它们处理整个文件:(1) How to delete last line in a text file?, (2) How to Delete the last line of a file.txt, (3) Efficient way to delete a line from a text file
-
内存映射文件的意义在于,一旦它们被映射,你就可以忘记源是一个文件,而使用whatever你想要的内存搜索函数或算法。
-
@MickyD 你知道有什么方法可以在 C# 中对整个文件进行内存映射,然后将其视为字节数组吗?查看
find和rfind方法的源代码后,如果数组可用,创建它们的C# 版本似乎并不难。我在找UnmanagedMemoryAccessor.ReadByte Method (Int64)吗?
标签: c# python-3.x translate