nekad sam bio Delphi programer i znao riješiti ovakvu stvar, no sad to trebam napraviti u powershellu, naravno jedino pomoću .net objekata.
Imam jedan (zapravo brdo) datoteka od po 250MB koje su zapravo streamovi u kojima su upakirane slike (nadzornih kamera). Trebam prolaziti kroz binarni stream i dijelove streama odijeljene start i stop delimiterom exportati u file. Tu stvar imam već odrađenu u pythonu tj. primjer koji je netko na Internetu odradio u pythonu i tu skriptu sada pozivam iz powershella. Cilj mi je sve odraditi u powershellu.
Ovo je primjer u pythonu:
Code:
start = 0
end = 0
with open(file_input, 'rb') as f:
f.seek(0, 2)
num_bytes = f.tell()
print ("File Size: %.2f MB" % float(num_bytes / 1024 / 1024))
print()
i = 0
status = "No files written"
t = tqdm(total=num_bytes, unit='B', unit_scale=True, unit_divisor=1024, desc="Progress")
mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
while 1:
f.seek(end)
t.set_description(status)
start = mm.find(b'\xFF\xD8', end)
if start == -1:
break
end = mm.find(b'\xFF\xD9', start)
if (picture % args.every == 0):
filename = args.prefix + "-" + str(count) + ".jpg"
filename_output = output_dir.joinpath(Path(filename).name)
file_output = open(filename_output, 'wb')
f.seek(start)
jpeg_data = f.read(end - start)
file_output.write(jpeg_data)
file_output.close()
status = "File " + filename + " written"
count += 1
picture += 1
t.update(end - start)
t.update(num_bytes - t.n)
t.close()
f.closed
start = 0
end = 0
with open(file_input, 'rb') as f:
f.seek(0, 2)
num_bytes = f.tell()
print ("File Size: %.2f MB" % float(num_bytes / 1024 / 1024))
print()
i = 0
status = "No files written"
t = tqdm(total=num_bytes, unit='B', unit_scale=True, unit_divisor=1024, desc="Progress")
mm = mmap.mmap(f.fileno(), 0, access=mmap.ACCESS_READ)
while 1:
f.seek(end)
t.set_description(status)
start = mm.find(b'\xFF\xD8', end)
if start == -1:
break
end = mm.find(b'\xFF\xD9', start)
if (picture % args.every == 0):
filename = args.prefix + "-" + str(count) + ".jpg"
filename_output = output_dir.joinpath(Path(filename).name)
file_output = open(filename_output, 'wb')
f.seek(start)
jpeg_data = f.read(end - start)
file_output.write(jpeg_data)
file_output.close()
status = "File " + filename + " written"
count += 1
picture += 1
t.update(end - start)
t.update(num_bytes - t.n)
t.close()
f.closed
Ja sam za sada došao do ovdje:
Code:
$path = "C:\_playground\test\hiv00000.pic"
$fsReader = New-Object System.IO.BinaryReader ([System.IO.File]::Open($path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite))
$lPos = $fsFile.Seek(0, [System.IO.SeekOrigin]::Begin)
$path = "C:\_playground\test\hiv00000.pic"
$fsReader = New-Object System.IO.BinaryReader ([System.IO.File]::Open($path, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::ReadWrite))
$lPos = $fsFile.Seek(0, [System.IO.SeekOrigin]::Begin)
Ima li netko volje prepisati ovo u .net kod? Moje ideje koje pale u Delphiju u .net-u. ne prolaze, no svakako bilo bi dobro da se zbog brzine i optimizacije koristi file stream ili neki cachirani stream i dio streama između start i stop indexa samo kopira u novi filestream.
Najsporija metoda bila bi proći kroz cijeli stream i pročitati sve start i stop markere od početka do kraja jer ni u jednoj .net stream ili reader klasi ne vidim neku .Find metodu za traženje binarnog patterna od trenutne pozicije u streamu pa prema EOF-u. tj. kraju streama/buffera.
Bio bi zahvalan na pomoći i sugestiji kako to izvesti.
Unaprijed, hvala!
God is real unless is declared as integer.