|
Every files has header which contains all information about the file.
Is there any function that read files' header.
Can I tell which application file to use to print/view the file base on the information of the file??
for example, I craeted test.txt file using notepad. then I rename the file as temp.t.
Is there any function to tell temp.t can open with notepad??
|
|
|
|
|
pnpfriend wrote:
Every files has header which contains all information about the file.
Not necessarily. It depends on the application that was used to create the file.
pnpfriend wrote:
Is there any function that read files' header.
Not a function per se, but there are a plethora of utility-like applications that do this. They're usually created on as as-needed basis.
pnpfriend wrote:
Is there any function to tell temp.t can open with notepad??
FindExecutable()
|
|
|
|
|
<br />
Not a function per se, but there are a plethora of utility-like applications that do this. They're usually created on as as-needed basis.
can you explain it to me again please.
What about By_HANDLE_FILE_INFORMATION structure?? nNumberOfLinks seem likes what I need.. but I dont' know how to use it..
Thank
|
|
|
|
|
pnpfriend wrote:
nNumberOfLinks seem likes what I need...
I doubt it, but here's an example:
HANDLE hf;
BY_HANDLE_FILE_INFORMATION bhi;
hf = CreateFile("somefile", GENERIC_READ, FILE_SHARE_READ|FILE_SHARE_WRITE, NULL, FILE_ATTRIBUTE_NORMAL, NULL);
if (INVALID_HANDLE_VALUE != hf)
{
if (GetFileInformationByHandle(hf, &bhi) == TRUE)
printf("Links = %lu\n", bhi.nNumberOfLinks);
CloseHandle(hf);
}
|
|
|
|
|
you are right.. it's not what I want.
So there is no function that will get the file header and can tell what associate file to use eventhough the file doesn't have the extension.
I tried FindExecutable(), it can't tell what associate file to use if the file doesn't have extension or that extension didn't register.
Is it possible to tell what associate file to use base on what's in the file header???
|
|
|
|
|
pnpfriend wrote:
Is it possible to tell what associate file to use base on what's in the file header???
Technically, yes, but it would be a guessing game at best. There are as many file types as there are grains of sand on the beach (in theory, anyway). You'd have to code all of the permutations of what header (assuming you could even get the format of the header) went with what app, and then if a new one was introduced...well, you get the idea. It's just not somnething you could do with any hope of success.
|
|
|
|
|
huuuu... sound like there is no way I can actually use the file header to determind the associated file.
one final question, how to get the file header? Is there a function to get the file header?? When I mean getting file header, I meant getting all possible information about the file.
Thank You Dave
|
|
|
|
|
Every file's format is different and unique unto itself. Some files don't even have a "header" but just contain raw data.
pnpfriend wrote:
When I mean getting file header, I meant getting all possible information about the file.
Depending on what you mean by "all possible information," some information about a file can be obtained with GetFileAttributes[Ex], as well as StgOpenStorageEx() for summary-type information.
|
|
|
|
|
As david said not every file has a header. There are as many file formats as grains of sand. I myself have invented at least a dozen file formats. There is no standard format for a header. You must know how to decode the file to read the header in most cases.
John
|
|
|
|
|
thank you both for your explaination.
|
|
|
|
|
Decode!!!
Can you please give me some example in decoding for one file?
for example, a pdf file.
I have to read in binary right. and then I really don't know how to continue from there.
|
|
|
|
|
For PDF search the internet for ghostscript. You do not want to write decoders for all file types. Writing one for PDF alone should take a person several months work. I was just thinking depending on what information you need you might be able to get the info you need from the pdf file without decoding the whole file.
John
|
|
|
|
|
Oh.. I think I misunderstood you saying decode.
here is my plan to know the file creator.
I need to collect all magic number or creator of each and every file and crate the list or table. for example,
file magic numbers
Then I will read may be first 100 byte of the file and see if i can find any magic number that exits in the table. By doing so, I can tell the file is created with the particular application.
So I don't have to worry about whether there is a file extension or weird file extension of the file. but I can still view/print the file with the correct application.
|
|
|
|
|
Ok. That will work for some file types but by no means all. A PDF file should always start with %PDF.
John
|
|
|
|
|
Ok. I thought you were still trying to extract the author and other properties from the file.
John
|
|
|
|
|
no I'm not going to change anything to the file but only to identify the creator of the file which doesn't have file extension.
so can i rely on the magic number of the file to identify the creator?
|
|
|
|
|
pnpfriend wrote:
so can i rely on the magic number of the file to identify the creator?
In the files that have a magic number for the most part yes. The problem is that sometimes a magic number is not at the beginning of the file. For the most part it is but sometimes it is not. A magic number is just a string of bytes and it is perfectly valid to be in any file so (although highly unlikely) you could find a magic number of one file type in the first few bytes of a different file type. You can only be 100% sure if you decode the file and this is way too difficult and too much work for any programmer. Teams of programmers spend years developing code to decode formats like PDF, JPEG, PNG ...
John
|
|
|
|
|
pnpfriend wrote:
no I'm not going to change anything to the file
Its not about changing the file but as I said in the last post sometimes you have to decode a file to verify it is the correct type but even this has its problems. New versions appear and the decoder of the old version will sometimes not be able to read the first version.
John
|
|
|
|
|
I hope I am not discouraging you at all. My point that this is not an easy task. You have to weigh many factors. Obviously you can not support all formats but you can support some of the most common ones with a great deal of accuracy. There is a web site that has the doccumentation for at least 100 different formats. I forgot the link but I have seen it posted on this site many times. You might want to post a question to the lounge asking for that. I think this type of question is permitted.
[EDIT]
Oh. I see you already found that in another thread... http://www.wotsit.org/[^]
[/EDIT]
John
|
|
|
|
|
Oh Please don't say that, you are not discouraging me at all..
But even to find the magic number in the first 100 byte is difficult? I have never done reading file in byte before
Would
BYTE b;
ifstream afile;
afile.open("c:\\k.pdf",ios::byte);
afile>>b;
be a correct way to do it?
Thank you very much and I'll do post a new thread for asking common file types..
|
|
|
|
|
That will read only one byte.
I never use streams. I either use the WIN32 api ReadFile() or MFC so I am exactly certian how to read a file with streams so I don't want to give you any wrong information. Post a question in the VC++ forum asking how to read the first 100 bytes of a binary file into and array using streams.
John
|
|
|
|
|
While working on a Win16 to Win32 convertion I was asked to modify the origanal Win16 (Ver 2.1) of the software. During testing of the Win16 (Ver2.2) we noticed a problem and upon look at the Win32 port we saw that it also the same problem.
Problem: We have a simple little loop that reads data from a file with out errors, but when the memory contains of the array of data is dumped to disk it contains no data. It is as if the file was full of 0x00. The test file only contains 2048 bytes of data. The Win16 code for reading is the same in both Ver 2.1 and Ver 2.2 [NO CHANGE], but it works in Ver 2.1. Also checking the Win32 beta port I have descover it to has the same problem.
Quesion: Does anyone have an idea of what is going on?
(Yes the file does contain valid data and can be view with an hex editor)
BOOL File_Read(
HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPDWORD lpNumberOfBytesRead,
LPOVERLAPPED lpOverlapped
)
{
if( !ReadFile(hFile,lpBuffer,nNumberOfBytesToRead,lpNumberOfBytesRead,NULL) )
{
TCHAR szError[512];
DWORD dwLen = FormatMessage(
FORMAT_MESSAGE_FROM_SYSTEM
| FORMAT_MESSAGE_IGNORE_INSERTS, NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
szError, sizeof(szError)/sizeof(TCHAR), NULL);
if( dwLen )
Vsl_MessageBox(ghwnd,szError,gszAppName,MB_OK|MB_ICONSTOP);
return FALSE;
}
return TRUE;
}
lpBinFont = (LPBIN_FONT)GlobalAllocPtr(GPTR,(DWORD)sizeof(BIN_FONT)+dwFLen);
if( !lpBinFont )
return(NULL);
.....
DWORD nNumberOfBytesToRead = 0x0800L;
SetFilePointer(hFontFile,0,NULL,FILE_BEGIN);
dwRead = 0;
for( dwOffset=0;dwOffset<dwFLen;dwOffset+=dwRead )
{
if( nNumberOfBytesToRead > (dwFLen-dwOffset) )
nNumberOfBytesToRead = dwFLen - dwOffset;
if( !File_Read(hFontFile,(LPVOID)((lpBinFont->DataBits)+dwOffset),
nNumberOfBytesToRead,&dwRead,NULL) )
{
break;
}
if( dwRead < nNumberOfBytesToRead )
{
dwOffset += dwRead;
break;
}
}
lpBinFont = (LPBIN_FONT)GlobalAllocPtr(GPTR,(DWORD)sizeof(BIN_FONT)+dwFLen);
if( !lpBinFont )
return(NULL);
.....
_llseek(hFontFile,0,0);
for( dwOffset=0;dwOffset<dwFLen;dwOffset+=uRet )
{
uRet = _lread(hFontFile,(lpBinFont->DataBits)+dwOffset,0x0800U);
if( uRet == HFILE_ERROR )
break;
if( uRet < 0x0800U )
{
dwOffset += uRet;
break;
}
}
Trust in the code Luke. Yea right!
|
|
|
|
|
More Info: Newer binaray file are not being read correctly [ALL VERSIONS] but older files are loaded just fine. The same program was used to create the old binaray files and the new files. One more thing, a second routine reads the data from the same file before the file is closed and has no problem getting the data.
Trust in the code Luke. Yea right!
|
|
|
|
|
Solution (Win16):
uRet = _lread(hFontFile,(BYTE HUGE*)(lpBinFont->DataBits)+dwOffset,0x0800U);
BLASTED @#^$& 16 BIT CODE ANY WAY.
Trust in the code Luke. Yea right!
|
|
|
|
|
I am reading data from memory on a pci card and all the values are of double type.
I really just want to read one huge chunck of size 32bytes and parse each double out of it.
I don't know how I can do that with the given *.dll so here I am.
I thought I would read in a 32bit at a time from: memory address i ----- memory address i + 1........
then I would cast them to a 64 bit long. The code below might explain it better.
I know I am doing something, just don't know what it is. The compiler says I have too many types in the decliration.
Thanks, steven
[code]
double buf[2];
struct{
unsigned first;
unsigned next;
} in_data;
for(i=0; i<2; i++){
in_data.first = rfmRead(rh, , 0x40, buf, sizeof(buf));//address 1
in_data.next = rfmRead(rh, , 0x41, buf, sizeof(buf));//address 2
}
double dd = *(unsigned long long *) &in_data;
[/code]
|
|
|
|