现在有若干个 容量超过 500M 的 文本文件 确定是500M以上 不用怀疑 
需要统一替换每个文件刚开始的几行中的某个数据 比如 
文件的头5行内容为 
AAAAAAAAAAAA
BBBBBB
CCCCCCCCC
DDD
EEEEEEEE
.....
....
.......
现在需要把第4行的DDD 替换成 KKK 仅此而已.如何操作? 文件实在太大 常规手段打不开文件啊 . 
我的机器 双 P4 2.8 CPU 1G内存 
用Ultra Edit 或者 Notepad++ 全部是假死状态 跪求新颖的思路方法. 如何操作这么大的文件. 
只要能把DDD 替换成 KKK 就可以了 万分感谢各位大虾.~~

解决方案 »

  1.   

    Open FileName For Binary As #FileNumber
    不可以吗?
      

  2.   

    //Open FileName For Binary As #FileNumber
    不可以吗?读出来没有问题,写回数据会有麻烦
      

  3.   

    各位大虾 
    不好意思 是我没说详细 举的例子不够好其中 DDD 要替换成 KKKKKKKKKKKKK这样要增加文件长度的 直接写字节 好象不行啊。 唉。。
      

  4.   

    //写回数据有什么麻烦?直接写那几个字节位置不就行了么?又没有大于2G字节。把DDD 替换成 KKK 当然没有问题,可是,如果替换的字串的长度不等,就会有问题了
      

  5.   

    Rainstormmaster
    能帮忙写个可行的办法吗?只要能达到效果 什么方法都可以
    硬盘空间多的是 速度慢点也没关系 
    只要不会发生假死, BTW:文本文件是不是一行可以写无限个字符?还是固定一行只能写几个字符的?
    用二进制打开 如何一行一行的读取文件内容?
    可以确定是的: 
    文件里面含有回车符(看的见的 是一个黑块)、逗号和空格
    读取文件内容的命令按什么符号来做为分割符以确定一次读多少个字符的啊?
    能自定义的吗?
      

  6.   

    可以用Put语句、Seek 语句解决吧?
      

  7.   

    试试:Private Sub Command1_Click()
        
        Dim fname As String
        Dim s As String
        Dim Head As Long
        Dim i As Long
       
        fname = "c:\test.txt"
        Open fname For Input As #1
        Do While Not EOF(1)
            Line Input #1, s
            If s <> "DDD" Then
                i = Seek(1)      '获得文件位置
            Else
                Exit Do
            End If
        Loop
        Close #1
        
        Head = FreeFile
        Open fname For Binary Access Write As #1
        Put Head, i, "KKK"       '覆盖DDD
        Close #1
        
    End Sub
      

  8.   

    如果要删除每个文件的开头第1个字节(不用管是什么内容,这里只针对这种情况)难道一定要把整个文件写一遍吗?500M啊,就算是DMA133,那也要多少时间?
      

  9.   

    第一次读写把缓冲区转为字符串,用vbCrLf split到数组,替换数组的index为3的元素,再join到字符串,转回Byte数组,put到文件
      

  10.   

    1.用API操作文件,不要用VB的函数
    2.搜索和替换时使用二进制模式
    3.使用缓冲区
      

  11.   

    To viena(维也纳nn-实心木头人)
    老大,就一个200M文件也要几分钟啦,难道,楼主顶楼没有写:
    现在有若干个 容量超过 500M 的
    需要统一替换每个文件在我这里遇到的情况,还要加一句:
    需要经常操作那样的话几分钟恐怕是不行的吧?大家是否可以找找,有没有对删除一小部分文件头操作特快的软件?如果没有的话,那恐怕是不能实现的喽:(
    如果有的话,那大家是否可以思考一下,
    为什么它可以这么快?难道也是读写全部文件吗?
      

  12.   

    to 楼主:缓冲区不会?没有做过二进制读写吗?很简单的
    缓冲区指的就是Byte数组,比如定义大小32768的缓冲区
    Redim buffer(32767) As Byte
    就可以了,数组下标从0开始省略中间的参数,分别用get、put语句读写整个缓冲区的内容到文件
      

  13.   

    不知道有没有未公开的截断>>>文件头<<<的API?只要调用这个API,不需要读写全部文件,而只需API从底层对分区表操作,把要删的文件头占的磁盘空间标为删除,移动一下文件首簇标记就可,这样不管对付多大的文件,真的好快啊。不知道有没有高手能用汇编或VC什么的写一个这样的API呢?
      

  14.   

    因为硬盘文件是按簇保存的,只有文件尾部可能会无法占满整簇(但也不能再存其它文件),文件中部都必须是满簇的。一个文件占了哪些簇,这些簇按排列顺序写入FAT表。
    如果文件修改的部分,改前与改后都正好是占满硬盘整簇字节,那也许可通过修改FAT表实现,不过这种巧合的机率几乎为0!
    所以文件改写时改变了大小,一般只能通过复制重写方式。
    当然,数据库等程序不会这样,要么为修改预留空间,要么通过只加入改写标记,然后将修改内容附加文件或写到文件尾部来实现,那当然会很快。这种方式可以参考,不过对那些读取这种文件的程序要有相关办法才行。
      

  15.   

    一个笨办法:
    拆分文件就行了,以二进制打开那个500M的文件,读取前10K数据后,写入第二文件,在第二个文件中进行相应的替换,完了之后生成第三个文件,再读出500M的文件的第10K之后的数据()分批读出),分批写入第三个文件中,直到写完所有数据,删除掉500M的那个文件,删除第二个文件,最后将第三个文件更名为原来500M的文件名,一切OK!!!!!!!!!!
      

  16.   

    to  homezj(小吉) 
    说的经典 
    确实这些500M的文件 只是2个软件互相传递数据的一个过程文件
    替换那一小段数据 只是为了欺骗另一个软件 
    方便做工作。 所以 附加数据在文件尾 肯定不行 软件导入数据都是有固定格式的。