|
I need to check if a folder exists. I have a specific path and will perform a certain action only if that path exists. How can I check to see if a specific folder (ie. "c:\Program Files\Debug") exists.
I have already tried using the WIN32 API call GetFileAttributes. I was checking to see if there was an error or not to see if the folder exists. The call returns an error regardless. The path is a BSTR, casted to char*, casted to LPCTSTR, if this is a problem.
|
|
|
|
|
ChemmieBro wrote:
I need to check if a folder exists.
See here and here.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
Thanks for the links.
But actually, I tried pretty much everything there. Thing is, the _access ends up calling the GetFileAttributes API call and the GetFileAttributes call was what I was having problems with.
I actually found out what the problem was that I was having with GetFileAttributes. I guess the GetFileAttributes has it's own parser to parse the string you feed into it. I was feeding in a path that I had read straight from the registry. It was "C:\Program Files\Program". In order to turn off the parser (it tells me this in the help section), you need to append "\\?\" to the front of the path.
Since I had my path in a variable, I needed to do this in order to get the correct path for stuffing into the GetFileAttributes function...
Path = "\\\\?\\" + Path;
It works now.
|
|
|
|
|
ChemmieBro wrote:
Thing is, the _access ends up calling the GetFileAttributes API...
Where is this documented at?
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
I don't believe it is documented. But if you step into the _access() call while debugging, it's right there.
|
|
|
|
|
Thanks for the tip.
"Opinions are neither right nor wrong. I cannot change your opinion. I can, however, change what influences your opinion." - David Crow
|
|
|
|
|
I think you might be surprised if you take a 'generic' C app and build it in windows and then trace through the 'standard C function' calls. You will find many of them devolving into regular WIN32 API calls. People were trying to convince me one time that the File* functions (fopen, close, fprintf, etc.) were faster than CreateFile WriteFile, ReadFile, etc. I traced into the C runtime and find that after a lot of variable hashing and flags manipulation, they end up calling the Win32 API anyway, so I just started calling the Win32 API directly, as there is no effort at being 'port ready' to other platforms for our products.
I am not surprised that _access calls GetFileAttributes.
|
|
|
|
|
ChemmieBro wrote:
The path is a BSTR, casted to char*, casted to LPCTSTR, if this is a problem.
It is. A BSTR is a unicode string; you can't cast it to a char*. You'll have to call the unicode version of the function (GetFileAttributesW() ), or use the W2T() ATL conversion macro to convert from unicode to LPCTSTR.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
I implemented a function for something I worked on that checks to see if a file exists, but the documentation indicates that it works for directories as well as files. So take a look at this. It's worked well for me and seems very reliable. It seems different than the other responses, so if you are still looking for an alternative; here you go.
I simply created a CString as input. The CString may contain wildcard characters such as * or ?. FindFirstFile is a global method and can be found in the MSDN library so go ahead and look it up and feel free to cut and paste this function and play with it to see how it works. It's pretty simple.
BOOL CDXControlDlg::IsNewFile(CString& sPath)
{
// Check if files exists already
WIN32_FIND_DATA fileInfo;
HANDLE hFile = ::FindFirstFile(sPath, &fileInfo);
if (hFile == INVALID_HANDLE_VALUE) {
// File not found
return TRUE;
} else {
// File exists.
::FindClose(hFile);
return FALSE;
}
}
Best Regards,
Shawn
|
|
|
|
|
Hallo,Before all i want to say sorry to my poor english.
I'm little new in this kind of develop like C++, and i'm trying to do a client server in visual c++ where i have to do a connection with the login of one user that previous is registered (but it's not my problem).When i have the user login, with this user i have to send the information to the server and the server will say me what access i have, like if i have access to different devices like USB, cd-Rom,..( it's my real problem, how can i restrict the different kind of devices?) or what files have i access to download to my client and i think that here i have to implement Encrypt of files.
Somebody can say me how can i do this or which libraries can i use or a idea of like implement this problem.
Thank you very much and i hope that you can help me.
|
|
|
|
|
As for the client/server part of the question, I'd suggest that you look into writing network applications, there are plenty of good books on this. There is one by MS press that is great. As for the restricting access to devices part of the question, I'd suggest that you outsource this work to someone who knows about the internals of windows, someone who can develop device drivers. This isn't the sort of thing I'd suggest doing yourself if you don't have the understanding of these concepts already. You won't find any libraries to do this for you.
-- Rocky Dean Pulley
|
|
|
|
|
Ok, thanks, so you recommended me that i read something about Network applications, ok. But i have one question more, to who can i ask about develop device drivers?.
Thanks.
/Jorge
|
|
|
|
|
Hello all,
I am running into a somewhat odd problem with printing from an MFC program. I am getting printouts just fine, but there seems to be a difference between the preview page and the printed page. The preview, in this case, prints 40 lines to a page, while the printed version prints 41. Since the overall printout is about 64-65 pages long, this is causing the last few pages to be very different between the two.
I put in some TRACE statements to print the height of a line with each font type I am using, and this is what I got (the fonts are all Times New Roman, various point sizes):
For the Preview version:
Preparing Page 2
Page 2
Report Hdr: 00155
Page Hdr: 00095
Table Caption: 00115
Column Hdr: 00115
Table Body: 00095
Table Total: 00095
Page Footer: 00075
Report Footer: 00075
Printing Page 2
Line Start 1110
Line Start 1225
Line Start 1340
Line Start 1455
Line Start 1570
Line Start 1685
Line Start 1800
...
Line Start 5020
Line Start 5135
Line Start 5250
Line Start 5365
Line Start 5480
Line Start 5595
For the Print version:
Preparing Page 2
Page 2
Report Hdr: 00151
Page Hdr: 00094
Table Caption: 00114
Column Hdr: 00114
Table Body: 00094
Table Total: 00093
Page Footer: 00075
Report Footer: 00075
Printing Page 2
Line Start 1108
Line Start 1222
Line Start 1336
Line Start 1450
Line Start 1564
Line Start 1678
Line Start 1792
...
Line Start 4984
Line Start 5098
Line Start 5212
Line Start 5326
Line Start 5440
Line Start 5554
Line Start 5668
As you can see, the font heights are a little different. This is causing an extra line per page. I did not think this was possible, since I am using the default printer definition in both cases. Is there any way to compensate for this?
Thanks for any hint anyone can provide.
Santanu
|
|
|
|
|
Hi
I have trouble using CDoc variable in MainFrm. I have included Cdoc.h in MainFrm but the error of undeclared variable still existed.
CDoc& pDoc = GetDocument();
ASSERT_VALID(pDoc);
This is how I normally getting CDoc variable from CView but it doesnt work in MainFrm. Please advise. THanks.
|
|
|
|
|
I think there is a GetActiveDocument(). If not that, then use GetActiveFrame(), from there you get the view of the frame and from that the document of the view.
Its a bit long winded.
If you vote me down, my score will only get lower
|
|
|
|
|
Hi
Both of them cannot solve my problem. I got error C2440 for both of them.
THanks
|
|
|
|
|
Hi
Thanks for the advice.
Now, I created a new dialog class and i wanna use CDoc variable. AfxGetMainWnd doesnt work. I have tried GetActiveDocument and GetActiveFrame but it is for MainFrm. THanks.
|
|
|
|
|
Hello ,i had a problem . I am trying 2 communicate between 2 different languages ,throughs socket. i had create a socket and opened it in listening mode at some port. the data received is in form of xml , xml is parsed and according to that, data it is send to some specific module.
i want my port to listein various request continously.
but until that application is completed , the socket is unable to listein again. i want to implement multithreading in that.
such that my application as it receives the xml , send it to the parser and again start listening.
Plz help me in that. ANy suggestion would be helpful
Thanks in advance
Rahul Agarwal
|
|
|
|
|
|
Take a look at http://www.flounder.com/detach.htm#Sockets.
This should get you on your way.
Tom Wright
tawright915@yahoo.com
|
|
|
|
|
Hi. please help
I have associated one pane of a view created by CSplitterWnd to a CFormView derived class in OnCreateClient, now I want to switch between different CFormView classes at runtime. what is the safe way to do that? should I do that from CDocument class or... thank you
|
|
|
|
|
I know Paul Dilascia wrote an article on replacing views many years ago on MSJ[^].
You should also be able to do a search on codeproject for "replacing view" or such.
Iain.
|
|
|
|
|
How about this (fragments of my code):
<br />
CMainFrame *pMainFrame=(CMainFrame*)AfxGetMainWnd();<br />
(pMainFrame->m_wndSplitter).ReplaceView(RUNTIME_CLASS( CRightView ), CSize(100,100)); <br />
(pMainFrame->m_wndSplitter).ReplaceView(RUNTIME_CLASS( CColorRight ), CSize(100,100)); <br />
<br />
Hope, this will help you, bilas.:->
|
|
|
|
|
It won't help *me* much, or anyone using MFC4.2 (comes with VC++ 6).
I've just looked at the docs, and also the relevant header file, and
ReplaceView is not a member of CSplitterWnd. It might be under later
versions though. Behind the times, I am.
If that actually is cut and paste from your code, rather than from
memory, I'm surprised there's no paramater for *which* splitter view
to change. Or did you have your own splitter pane which only changes
(eg.) the pane on the right?
Being picky, I would recommend he handles this in his CChildFrame (MDI)
or CMainFrame (SDI), so the casting wouldn't be necessary. But I
was lazy!
But doing the search I recommended comes up with an article on how
to do exactly what I think Anonymous wants.
|
|
|
|
|
I want to make a program that can connect to internet and use up to date information without having to manually enter that information. How do I retrieve information such as a text in a table cell from the IE browser? Can I do that without programmatically openning the browser and/or downloading the whole page?
|
|
|
|