Convert / Read Btrieve Sequential file to human readable text using C# - c#

Does anyone know if its possible to read ascii the files that Btrieve Maintenance Utility creates during its recover process using C#
We create sequence files using the following command on windows
for %%f in (*.xq?) DO BUTIL -recover %%f %%f.seq
I know these files are Ascii files but when i open them in notepad++ it's almost impossible to make something of it
If i look at the documentation of it,i can't figure out how i need to read these files using C#

Those aren't regular ASCII files. They are byte images of the record. For strings, they come through as ASCII but numbers don't come through as human readable text. You would have to parse the individual bytes within each line and would need record structure.
If you know the record structure, you might be able to parse the data into a structure but not every Btrieve data type is directly accessible through C#.
A better option is to use the Btrieve / PSQL client, read the actual data file, and extract it using a proper Btrieve / PSQL / Actian interface (like ODBC, OLEDB, Managed Provider, even the Btrieve API).

Related

BCP (bulk copy program) binary data c#

I'm working with Microsoft Sql Server. I use bcp to recovery my data and it's ok. I create a binary file.
Now I want read this binary file trought my c# application, but I have problems.
I create binary with o without \r terminator, but I have problems.
I try all web solutions (BinaryReader, convert to byte array etc...) that I find.
Thanks in advance.

How to Save a Binary Representation to file

I have the following textual binary representation: "0x255044462D312E340D0A25FFFFFFF..."
I know it's a pdf.
I know it's the textual represantation from a sql server column (image data type).
But im lost to find out how to save this binary to a pdf file on my disk and view the content.
Maybe someone can hint me in the right direction.
Best Regards and Thanks in Advance
You're correct that it is a PDF file (at least it masquerades like on. You have hexadecimally encoded bytes; the first read:
255044462D312E340D0A
%PDF-1.4<CR><LF>
So you appear to have a PDF 1.4 string.
Just take two characters from the string, treat them as hex, convert them to the correct byte and write them to a file. Write binary, not textually (you don't want to add additional line-breaks in there, PDF is too binary to let that work.
(I did the conversion using this site: http://www.dolcevie.com/js/converter.html)
I'm not sure what database you are working with or how you are getting your string that you have above.
Many databases allow you to save binary data as a blob or some other byte array type. I believe in MSSQL this is called an "image" but I am not 100% on that. I would start by looking into the two following links in order. The first link talks about how to pull byte array data from a database. The example is in Visual Basic but should be easily changed to C# if that is what you are using.
The second link contains an example of how to save that byte array data to the file system.
I would also suggest posting some of the code you have tried as well so that the community may comment and point out areas you possibly had misunderstandings on.
1.) http://support.microsoft.com/kb/308042
2.) Save and load MemoryStream to/from a file
http://www.pdfsharp.com/PDFsharp/ can read in binary data and you can call .Save() and it will make the PDF file to disk for you.

Edit VSAM file using C#

We are looking at different ways to update a VSAM file.
One of the things that we would like to do is to stop writing any new cobol code.
We were wondering is it possible to download a VSAM file from the Main Frame to a Windows Server, then use a C# program to edit it, then transfer it back to the Main frame?
Has anyone tried this?
And yes we are moving away from the use of VSAM, but it takes time.
There are plenty of other options for updating a VSAM file other than a COBOL program.
Transferring the file and and back again seems a perverse and error prone way to update a simple VSAM file. Most VSAM files contain a mix of character, integer and packed decimal data, C# plain cannot handle mainframe packed decimal and any attempt to translate EBDCIC to ASCII during file transfer will corrupt the packed decimal and binary values, so, you will need to manipulate raw EBCDIC characters.
Obviously you can write a COBOL program! (seems perverse not to!)
You could also write a C, C++, Java or PL/1 program all of which run on the mainframe, all of which have VSAM support.
You could extract to a sequential file update with a script (zsh, Rexx, PERL etc. etc.) and reload. (Your site may have an add-in that allows direct update from Rexx).
Most largish mainframe sites have an add on utility like File-Aid, Startool or Ditto which allow direct editing of VSAM files.
The MS way would be to use Biztalk Microsoft Host Integration Server to access VSAM.
There might be other non-MS drivers, which I am not aware of - maybe via DB2 Windows drivers.

Drive searching

I am developing an application and I would like to be able to search the whole drive for a regular expression. I would prefer to do this in c# but I can call other languages. Is there any easy way to just seek through all the binary data on a drive from begining to end?
Here's an implementation of grep in C#
http://dotnet.jku.at/applications/Grep/Src.aspx
You can modify to follow subdirectories -- it works off of an array of filenames.
AFAIK there is no simple way to do this on raw binary data (You would need direct disk control).
If file-basis is enough enumerating all files, opening them for binary shared reading (catch the exceptions for the ones that are system protected) and then looking for the data should be straightforward. However this will be quite slow as enumerating and opening all files will take some time.
I don't think C# can read all files / data for the drive the OS is on, since the OS locks some files.
You could use the System.IO namespace to enumerate all files, and then scan them individually byte by byte, this obviously would take a long time.
Do you really want to do this ? How are you going to search:
.doc
.xls
.pdf
.html
etc.? Each file type will represent the string you're searching for in different ways.
This article shows how to read data directly from the disk. Everything they do from C++ could be done from C# using PInvoke.

Is there an easy way to determine the type of a file without knowing the file's extension?

I have a table with a binary column which stores files of a number of different possible filetypes (PDF, BMP, JPEG, WAV, MP3, DOC, MPEG, AVI etc.), but no columns that store either the name or the type of the original file. Is there any easy way for me to process these rows and determine the type of each file stored in the binary column? Preferably it would be a utility that only reads the file headers, so that I don't have to fully extract each file to determine its type.
Clarification: I know that the approach here involves reading just the beginning of each file. I'm looking for a good resource (aka links) that can do this for me without too much fuss. Thanks.
Also, just C#/.NET on Windows, please. I'm not using Linux and can't use Cygwin (doesn't work on Windows CE, among other reasons).
you can use these tools to find the file format.
File Analyser
http://www.softpedia.com/get/Programming/Other-Programming-Files/File-Analyzer.shtml
What Format
http://www.jozy.nl/whatfmt.html
PE file format analyser
http://peid.has.it/
This website may be helpful for you.
http://mark0.net/onlinetrid.aspx
Note:
i have included the download links to make sure that you are getting the right tool name and information.
please verify the source before you download them.
i have used a tool in the past i think it is File Analyser, which will tell you the closest match.
happy tooling.
This is not a complete answer, but a place to start would be a "magic numbers" library. This examines the first few bytes of a file to determine a "magic number", which is compared against a known list of them. This is (at least part) of how the file command on Linux systems works.
Someone else asked a similar question and posted the code used to do exactly this. You should be able to take what is posted here, and slightly modify it so that it pulls from your database.
https://stackoverflow.com/questions/58510
In addition to that, it looks like someone has written a library based off of magic numbers to do this, however, it looks like the site requires registration, and some form of alternate access in order to download this lirbary. The documentation is avaliable for free without registration, that may be helpful.
http://software.topcoder.com/catalog/c_component.jsp?comp=13249160&ver=2
The easiest way I know is to use file command that it is also available in Windows with Cygwin .
A lot of filetypes have well defined headers that begin the file. You could check the first few bytes to check to see how the file begins.
Easiest way to do this would be through access to a *nix (or cygwin) system that has the 'file' command:
$ file visitors.*
visitors.html: HTML document text
visitors.png: PNG image data, 5360 x 2819, 8-bit colormap, non-interlaced
You could write a C# application that piped the first X bytes of each binary column to the file command (using - as the file name)
You need to use some p/invoke interop code to call the SHGetFileInfo method from the Win32 API. This article may also help.

Categories