15 мая 2023 года "Исходники.РУ" отмечают своё 23-летие!
Поздравляем всех причастных и неравнодушных с этим событием!
И огромное спасибо всем, кто был и остаётся с нами все эти годы!

Главная Форум Журнал Wiki DRKB Discuz!ML Помощь проекту


How to verify if a document is already open

Ari Villaca -- villaca@correionet.com.br
Saturday, January 18, 1997

Environment: MSVC 4.0/Win95

How can I use the filename parameter of the CWinApp::OpenDocumentFile(
LPCTSTR lpszFileName ) to verify if the related document is already opene=
d?

I need to make sure that short and long filenames are verifyed.

For example, if I have Test1.XXX opened, the file verification routine=20
should return TRUE for both C:\WorkSpace\Test1.XXX and
C:\WorkSp~1\Test1.XXX filenames.=20

Regards,

Ari

-------------------------------------------------------------------------=
---
-
 Ari de Moura Villa=E7a
 					e-Mail:	villaca@correionet.com.br

 Av. Moraes Sales, 987 Apto.113		fone:	+55 19 232-2440
 13010-001 - Campinas, SP		fax:	+55 19 232-2440
 Brasil
-------------------------------------------------------------------------=
---



Tim Hagemann -- Tim@way2.net
Tuesday, January 21, 1997

Ari,

you can do this by processing all document templates and all documents =
of this templates in a nested loop:

CYourApp::CheckIfLoaded(const char *f_Path)
{
	POSITION l_tempPos,l_docPos;

	for (l_tempPos =3D GetFirstDocTemplatePosition();l_tempPoss !=3D NULL;)
	{
		CDocumentTemplate *l_DocTempl =3D GetNextDocTemplate(l_tempPos)

		for (l_docPos =3D l_DocTempl->GetFirstDocPosition();l_docPos !=3D =
NULL;)
		{
			CDocument* l_Doc =3D l_DocTempl->GetNextDoc(l_docPos);
			ASSERT(l_Doc);

			if (l_Doc->GetPathName =3D=3D f_Path) return TRUE;
		}
	}

	return FALSE;
}

(I typed the code in my Mail Program - no compiler has ever seen it...)

I'm not sure about the long / short filenames. I my opinion, you only =
have to check for the long filename, cause this is the one used in =
Win32.



Tim Hagemann
ifa informationssysteme GmbH




Tim Hagemann -- Tim@way2.net
Tuesday, January 21, 1997

Ari,

you can do this by processing all document templates and all documents =
of this templates in a nested loop:

CYourApp::CheckIfLoaded(const char *f_Path)
{
	POSITION l_tempPos,l_docPos;

	for (l_tempPos =3D GetFirstDocTemplatePosition();l_tempPoss !=3D NULL;)
	{
		CDocumentTemplate *l_DocTempl =3D GetNextDocTemplate(l_tempPos)

		for (l_docPos =3D l_DocTempl->GetFirstDocPosition();l_docPos !=3D =
NULL;)
		{
			CDocument* l_Doc =3D l_DocTempl->GetNextDoc(l_docPos);
			ASSERT(l_Doc);

			if (l_Doc->GetPathName =3D=3D f_Path) return TRUE;
		}
	}

	return FALSE;
}

(I typed the code in my Mail Program - no compiler has ever seen it...)

I'm not sure about the long / short filenames. I my opinion, you only =
have to check for the long filename, cause this is the one used in =
Win32.



Tim Hagemann
ifa informationssysteme GmbH




Tim Hagemann -- Tim@way2.net
Thursday, January 23, 1997

Ari,

you can do this by processing all document templates and all documents
of 
this templates in a nested loop:

CYourApp::CheckIfLoaded(const char *f_Path)
{
	POSITION l_tempPos,l_docPos;

	for (l_tempPos = GetFirstDocTemplatePosition();l_tempPoss != NULL;)
	{
		CDocumentTemplate *l_DocTempl = GetNextDocTemplate(l_tempPos)

		for (l_docPos = l_DocTempl->GetFirstDocPosition();l_docPos != NULL;)
		{
			CDocument* l_Doc = l_DocTempl->GetNextDoc(l_docPos);
			ASSERT(l_Doc);

			if (l_Doc->GetPathName == f_Path) return TRUE;
		}
	}

	return FALSE;
}

(I typed the code in my Mail Program - no compiler has ever seen it...)

I'm not sure about the long / short filenames. I my opinion, you only
have 
to check for the long filename, cause this is the one used in Win32.



Tim Hagemann
ifa informationssysteme GmbH





Ari Villaca -- villaca@correionet.com.br
Sunday, January 26, 1997

Environment: MSVC 4.0 Windows 95

HI Tim,

Thanks for your replay to my question above.

My real problem was to expand a short filename to a long one.  It's
interesting to note that in Windows 95 the filename you get in
CWinApp::m_lpCmdLine can be short or long depending the way you start you=
r
application. And you can start an application in many different ways in
Windows95.

Since CDocument::GetPathName returns the path name CWinApp::m_lpCmdLine
provided it is necessary, in Windows 95,
to expand the short filename and call CDocument::SetPathName before you
verify if a document is already opened.

Now I expand short filenames as follows (forgive me any typos,
cut-and-paste, translation from portuguese...):

//expands a short filename
//ex. given "c:\worksp~1\longfi~1.xxx" ExpandFileName returns
"c:\workspace\longfilename.xxx"
//     given "c:\workspace\longfilename.xxx" ExpandFileName returns
"c:\workspace\longfilename.xxx"
CString CMyApp::ExpandFileName( CString sSupposedShortFileName )
{
	WIN32_FIND_DATA FileData;
	FileData.cFileName[0] =3D '\0';

	CString sFileName =3D sSupposedShortFileName;
	CString sTempFileName =3D "";
	CString sExpandedFileName =3D "";
	CString s1 =3D "";

	while ( sFileName.GetLength() > 0 )
	{
		int i;
		if ( ( i =3D sFileName.Find( '\\' ) ) !=3D -1 )
		{
			sTempFileName =3D sExpandedFileName + sFileName.Left( i );
			sFileName =3D sFileName.Right( sFileName.GetLength() - i - 1);
			FindFirstFile( sTempFileName, &FileData );
			if ( FileData.cFileName[0] !=3D '\0' )
			{
				s1 =3D " ";
				int j =3D 0;
				while ( FileData.cFileName[j] !=3D '\0' )
				{
					s1.SetAt( 0, FileData.cFileName[j] );
					sExpandedFileName +=3D s1;
					j++;
				}
			}
			else
				sExpandedFileName =3D sTempFileName;
			FileData.cFileName[0] =3D '\0';
			sExpandedFileName +=3D " ";
			sExpandedFileName.SetAt( sExpandedFileName.GetLength() - 1, '\\' );
		}
		else
		{
			sTempFileName =3D sExpandedFileName + sFileName;
			sFileName =3D "";
			FindFirstFile( sTempFileName, &FileData );
			if ( FileData.cFileName[0] !=3D '\0' )
			{
				s1 =3D " ";
				int j =3D 0;
				while ( FileData.cFileName[j] !=3D '\0' )
				{
					s1.SetAt( 0, FileData.cFileName[j] );
					sExpandedFileName +=3D s1;
					j++;
				}
			}
			else
				sExpandedFileName =3D sTempFileName;
			FileData.cFileName[0] =3D '\0';
		}
	}
	return sExpandedFileName;
}

As usual, comments, enhancements, critics etc etc to method above are ver=
y
wellcome.

Best regards,

Ari
-------------------------------------------------------------------------=
---
-
 Ari de Moura Villa=E7a
 					e-Mail:	villaca@correionet.com.br

 Av. Moraes Sales, 987 Apto.113		fone:	+55 19 232-2440
 13010-001 - Campinas, SP		fax:	+55 19 232-2440
 Brasil
-------------------------------------------------------------------------=
---




| Вернуться в корень Архива |