Чтение и запись в файл с помощью VBScript

Как мы можем прочитать и записать строку в текстовый файл с помощью VBScript? Я имею в виду, что у меня есть текстовый файл, который уже присутствует, поэтому, когда я использую этот код ниже: -

Set fso = CreateObject("Scripting.FileSystemObject" )            
Set file = fso.OpenTextFile("C:\New\maddy.txt",1,1) 

Это открывает файл только для чтения, но я не могу ничего писать, и когда я использую этот код: -

Set fso = CreateObject("Scripting.FileSystemObject" )            
Set file = fso.OpenTextFile("C:\New\maddy.txt",2,1)

Я могу использовать этот файл для записи, но ничего не могу прочитать. Есть ли способ открыть файл для чтения и записи, просто вызвав метод OpenTextFile только один раз.

Я действительно новичок в VBScript. Я знаком только с концепциями C. Есть ли ссылка, по которой я действительно могу начать работу с VBScript?

Думаю, мне нужно хорошо знать концепции объектов и свойств.


person Community    schedule 17.07.2009    source источник


Ответы (9)


Вы можете создать временный файл, а затем переименовать его обратно в исходный файл:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
strTemp = "c:\test\temp.txt"
Set objFile = objFS.GetFile(strFile)
Set objOutFile = objFS.CreateTextFile(strTemp,True)
Set ts = objFile.OpenAsTextStream(1,-2)
Do Until ts.AtEndOfStream
    strLine = ts.ReadLine
    ' do something with strLine 
    objOutFile.Write(strLine)
Loop
objOutFile.Close
ts.Close
objFS.DeleteFile(strFile)
objFS.MoveFile strTemp,strFile 

Использование OpenTextFile практически такое же:

Set objFS = CreateObject("Scripting.FileSystemObject")
strFile = "c:\test\file.txt"
strTemp = "c:\test\temp.txt"
Set objFile = objFS.OpenTextFile(strFile)
Set objOutFile = objFS.CreateTextFile(strTemp,True)    
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    ' do something with strLine 
    objOutFile.Write(strLine & "kndfffffff")
Loop
objOutFile.Close
objFile.Close
objFS.DeleteFile(strFile)
objFS.MoveFile strTemp,strFile 
person ghostdog74    schedule 17.07.2009
comment
Единственное, что вы должны использовать objOutFile.WriteLine(Inp) для вывода одних и тех же строк. - person ib11; 30.04.2019

Дополнительные сведения об объекте FileSystemObject см. На странице http://msdn.microsoft.com/en-us/library/aa242706(v=vs.60).aspx. Для хорошего VBScript я рекомендую:

  • Option Explicit, чтобы помочь обнаружить опечатки в переменных.
  • Функция и Sub для повышения удобочитаемости и повторного использования
  • Константа, чтобы всем известным константам присваивались имена.

Вот код для чтения и записи текста в текстовый файл:

Option Explicit

Const fsoForReading = 1
Const fsoForWriting = 2

Function LoadStringFromFile(filename)
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filename, fsoForReading)
    LoadStringFromFile = f.ReadAll
    f.Close
End Function

Sub SaveStringToFile(filename, text)
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filename, fsoForWriting)
    f.Write text
    f.Close
End Sub

SaveStringToFile "f.txt", "Hello World" & vbCrLf
MsgBox LoadStringFromFile("f.txt")
person Stephen Quan    schedule 16.01.2012
comment
Обеим функциям нужен метод f.Close, чтобы файлы не оставались открытыми. - person Rich; 28.02.2014
comment
.ReadAll, похоже, имеет ограничение на размер файла, которого нет у других методов. Или, по крайней мере, мой скрипт вылетает с файлами размером более 1 ГБ или около того ... - person JOATMON; 11.11.2016
comment
Не используйте ReadAll для больших файлов, вместо этого используйте объект TextStream для буферизации операций чтения / записи. - person user692942; 21.04.2020

Вы можете открыть два текстовых потока, один для чтения

Set filestreamIn = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt,1)

и один для добавления

Set filestreamOUT = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt,8,true)

FilestreamIN может читать с начала файла, а filestreamOUT может писать до конца файла.

person Tester101    schedule 17.07.2009

Не думаю ... вы можете использовать openTextFile только для чтения (1), записи (2) или добавления (8). См. здесь.

Если бы вы использовали VB6 вместо VBScript, вы могли бы:

Open "Filename" [For Mode] [AccessRestriction] [LockType] As #FileNumber

Использование режима Random. Например:

Open "C:\New\maddy.txt" For Random As #1
person Daniel F. Thornton    schedule 17.07.2009
comment
Я новичок в vbscripting, я просто знаком со своими концепциями C. Может ли кто-нибудь предложить мне какую-либо ссылку, чтобы действительно начать работу с vbscripting. Думаю, мне нужно хорошо разбираться в концепциях объектов и свойств .. Любые предложения ?? - person ; 17.07.2009
comment
Вот хороший учебник от W3Schools: w3schools.com/Vbscript/vbscript_intro.asp - person Daniel F. Thornton; 17.07.2009
comment
pianoman, Большое спасибо .. Я уже прошел по ссылке и просто рассказал об основных операциях. Я хочу немного углубиться, например, об использовании объектов, классов. Я действительно новичок в этих терминах как таковых. - person ; 17.07.2009
comment
Вот довольно подробное объяснение этих терминов: 4guysfromrolla.com/webtech/092399-1. shtml - person Daniel F. Thornton; 17.07.2009

Вы можете поместить его в лист Excel, idk, если он того стоит для вас, если он нужен для других вещей, но хранить информацию в таблицах Excel намного приятнее, потому что вы можете легко читать и писать одновременно с

 'this gives you an excel app
 oExcel = CreateObject("Excel.Application")

 'this opens a work book of your choice, just set "Target" to a filepath
 oBook = oExcel.Workbooks.Open(Target)

 'how to read
 set readVar = oExcel.Cell(1,1).value
 'how to write
 oExcel.Cell(1,2).value = writeVar

 'Saves & Closes Book then ends excel
 oBook.Save
 oBook.Close
 oExcel.Quit

извините, если этот ответ бесполезен, впервые пишу ответ и просто подумал, что это может быть лучше для вас

person Spy    schedule 04.09.2015

Вы также можете прочитать весь файл и сохранить его в массиве

Set filestreamIN = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt",1)
file = Split(filestreamIN.ReadAll(), vbCrLf)
filestreamIN.Close()
Set filestreamIN = Nothing

Манипулируйте массивом по своему усмотрению, а затем запишите массив обратно в файл.

Set filestreamOUT = CreateObject("Scripting.FileSystemObject").OpenTextFile("C:\Test.txt",2,true)

for i = LBound(file) to UBound(file)
    filestreamOUT.WriteLine(file(i))
Next

filestreamOUT.Close()
Set filestreamOUT = Nothing 
person Tester101    schedule 17.07.2009
comment
это один из способов, при условии, что размер файла невелик. - person ghostdog74; 18.07.2009
comment
Практически однострочник, т.е. вы могли бы пойти file = Split (CreateObject (...). OpenTextFile (..., 1) .ReadAll (), vbCrLf) :) - person Stephen Quan; 17.01.2012

Независимо от того, что вы пытаетесь сделать, не должно быть необходимости одновременно читать и записывать в файл. Это также потребовало бы больше памяти, чего всегда следует избегать. Я бы предложил прочитать весь файл с помощью метода .ReadAll, а затем закрыть его и сделать все, что вам нужно, с данными (при условии, что вы читаете содержимое в переменную), а затем выполнить запись в тот же файл и перезаписать файл . Если вас беспокоит, что что-то пошло не так при перезаписи текущего файла, вы всегда можете попытаться записать его в другой файл и выдать ошибку, если это не сработает, прежде чем пытаться перезаписать оригинал.

person Christopher J. Scharer    schedule 12.12.2014

Ниже приведен простой код для выполнения этого:

sLocation = "D:\Excel-Fso.xls"
sTxtLocation = "D:\Excel-Fso.txt"
Set ObjExl = CreateObject("Excel.Application")
Set ObjWrkBk = ObjExl.Workbooks.Open(sLocation)
Set ObjWrkSht = ObjWrkBk.workSheets("Sheet1")
ObjExl.Visible = True
Set FSO = CreateObject("Scripting.FileSystemObject")
Set FSOFile = FSO.CreateTextFile (sTxtLocation)
sRowCnt = ObjWrkSht.usedRange.Rows.Count
sColCnt = ObjWrkSht.usedRange.Columns.Count
For iLoop = 1 to sRowCnt
  For jLoop = 1 to sColCnt 
    FSOFile.Write(ObjExl.Cells(iLoop,jLoop).value) & vbtab 
  Next
Next

Set ObjWrkBk = Nothing
Set ObjWrkSht = Nothing
Set ObjExl = Nothing
Set FSO = Nothing
Set FSOFile = Nothing
person Pulkit Agarwal    schedule 30.06.2016
comment
Добро пожаловать в Stack Overflow! Будьте осторожны со ссылками на свой контент на разных сайтах, вы не хотите быть спамером. Вы должны включить сюда большую часть контента и использовать ссылку только в качестве ссылки. - person NathanOliver; 30.06.2016

Это для создания текстового файла

For i = 1 to 10
    createFile( i )
Next

Public Sub createFile(a)

    Dim fso,MyFile
    filePath = "C:\file_name" & a & ".txt"
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set MyFile = fso.CreateTextFile(filePath)
    MyFile.WriteLine("This is a separate file")
    MyFile.close

End Sub

И это для чтения текстового файла

Dim fso
Set fso = CreateObject("Scripting.FileSystemObject")
Set dict = CreateObject("Scripting.Dictionary")
Set file = fso.OpenTextFile ("test.txt", 1)
row = 0
Do Until file.AtEndOfStream
  line = file.Readline
  dict.Add row, line
  row = row + 1
Loop

file.Close

For Each line in dict.Items
  WScript.Echo line
  WScript.Sleep 1000
Next
person YourHelper    schedule 13.08.2016