Klasa CFile
Klasa bazowa klas plików klasy Microsoft Foundation.
Składnia
class CFile : public CObject
Elementy członkowskie
Konstruktory publiczne
Nazwa/nazwisko | opis |
---|---|
CFile::CFile | CFile Tworzy obiekt ze ścieżki lub uchwytu pliku. |
Metody publiczne
Nazwa/nazwisko | opis |
---|---|
CFile::Abort | Zamyka plik ignorując wszystkie ostrzeżenia i błędy. |
CFile::Close | Zamyka plik i usuwa obiekt. |
CFile::D uplicate | Tworzy zduplikowany obiekt na podstawie tego pliku. |
CFile::Flush | Opróżnia wszystkie dane jeszcze do zapisania. |
CFile::GetFileName | Pobiera nazwę pliku wybranego pliku. |
CFile::GetFilePath | Pobiera pełną ścieżkę pliku wybranego pliku. |
CFile::GetFileTitle | Pobiera tytuł wybranego pliku. |
CFile::GetLength | Pobiera długość pliku. |
CFile::GetPosition | Pobiera bieżący wskaźnik pliku. |
CFile::GetStatus | Pobiera stan otwartego pliku lub w wersji statycznej pobiera stan określonego pliku (funkcja statyczna, wirtualna). |
CFile::LockRange | Blokuje zakres bajtów w pliku. |
CFile::Open | Bezpiecznie otwiera plik z opcją testowania błędów. |
CFile::Read | Odczytuje (niebuforowane) dane z pliku w bieżącym położeniu pliku. |
CFile::Remove | Usuwa określony plik (funkcja statyczna). |
CFile::Rename | Zmienia nazwę określonego pliku (funkcji statycznej). |
CFile::Seek | Umieszcza bieżący wskaźnik pliku. |
CFile::SeekToBegin | Umieszcza bieżący wskaźnik pliku na początku pliku. |
CFile::SeekToEnd | Umieszcza bieżący wskaźnik pliku na końcu pliku. |
CFile::SetFilePath | Ustawia pełną ścieżkę pliku wybranego pliku. |
CFile::SetLength | Zmienia długość pliku. |
CFile::SetStatus | Ustawia stan określonego pliku (statyczna, funkcja wirtualna). |
CFile::UnlockRange | Odblokowuje zakres bajtów w pliku. |
CFile::Write | Zapisuje (niebuforowane) dane w pliku na bieżącej pozycji pliku. |
Operatory publiczne
Nazwa/nazwisko | opis |
---|---|
CFile::operator HANDLE | Uchwyt do CFile obiektu. |
Publiczne elementy członkowskie danych
Nazwa/nazwisko | opis |
---|---|
CFile::hFileNull | Określa, czy CFile obiekt ma prawidłową dojście. |
CFile::m_hFile | Zwykle zawiera dojście do plików systemu operacyjnego. |
Chronione składowe danych
Nazwa/nazwisko | opis |
---|---|
CFile::m_pTM | Wskaźnik do CAtlTransactionManager obiektu. |
Uwagi
Zapewnia on bezpośrednio niebuforowane, binarne usługi wejściowe/wyjściowe dysku, a pośrednio obsługuje pliki tekstowe i pliki pamięci za pośrednictwem klas pochodnych. CFile
działa w połączeniu z klasą CArchive
w celu obsługi serializacji obiektów klasy programu Microsoft Foundation.
Hierarchiczna relacja między tą klasą a jej klasami pochodnymi umożliwia programowi działanie na wszystkich obiektach plików za pośrednictwem interfejsu polimorficznego CFile
. Na przykład plik pamięci zachowuje się jak plik dysku.
Użyj CFile
i jego klasy pochodne dla operacji we/wy dysku ogólnego przeznaczenia. Użyj ofstream
lub innych klas firmy Microsoft iostream
do sformatowanego tekstu wysyłanego do pliku dysku.
Zwykle plik dysku jest otwierany automatycznie w CFile
trakcie budowy i zamykany w przypadku zniszczenia. Statyczne funkcje składowe umożliwiają przesłuchanie stanu pliku bez otwierania pliku.
Aby uzyskać więcej informacji na temat korzystania z programu CFile
, zobacz artykuły Pliki w MFC i Obsługa plików w dokumentacji biblioteki czasu wykonywania.
Hierarchia dziedziczenia
CFile
Wymagania
Nagłówek: afx.h
CFile::Abort
Zamyka plik skojarzony z tym obiektem i sprawia, że plik jest niedostępny do odczytu lub zapisu.
virtual void Abort();
Uwagi
Jeśli plik nie został zamknięty przed zniszczeniem obiektu, destruktor zamknie go za Ciebie.
W przypadku obsługi wyjątków CFile::Abort
różni się od CFile::Close
dwóch ważnych sposobów. Abort
Najpierw funkcja nie zgłosi wyjątku dotyczącego błędów, ponieważ błędy są ignorowane przez Abort
element . Po drugie, nie będzie asercją, Abort
jeśli plik nie został otwarty lub został wcześniej zamknięty.
Jeśli został użyty new
do przydzielenia CFile
obiektu na stercie, należy go usunąć po zamknięciu pliku. Abort
ustawia wartość m_hFile
CFile::hFileNull
.
Przykład
CStdioFile fileTest;
TCHAR* pszFileName = _T("Abort_File.dat");
// do stuff that may cause exceptions
CFileException ex;
if (!fileTest.Open(pszFileName, CFile::modeWrite, &ex))
{
ex.ReportError();
fileTest.Abort(); // close file safely and quietly
}
CFile::CFile
Tworzy i inicjuje CFile
obiekt.
CFile();
CFile(CAtlTransactionManager* pTM);
CFile(HANDLE hFile);
CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags);
CFile(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CAtlTransactionManager* pTM);
Parametry
hFile
Obsługa pliku w celu dołączenia do CFile
obiektu.
lpszFileName
Względna lub pełna ścieżka pliku do dołączenia do CFile
obiektu.
nOpenFlags
Kombinacja bitowa (OR) opcji dostępu do pliku dla określonego pliku. Zobacz sekcję Uwagi, aby uzyskać możliwe opcje.
pTM
Wskaźnik do obiektu CAtlTransactionManager
Uwagi
W poniższych pięciu tabelach wymieniono możliwe opcje parametru nOpenFlags .
Wybierz tylko jedną z następujących opcji trybu dostępu do plików. Domyślnym trybem dostępu do plików jest CFile::modeRead
, który jest tylko do odczytu.
Wartość | Opis |
---|---|
CFile::modeRead |
Żąda dostępu tylko do odczytu. |
CFile::modeWrite |
Żąda dostępu tylko do zapisu. |
CFile::modeReadWrite |
Żąda dostępu do odczytu i zapisu. |
Wybierz jedną z następujących opcji trybu znaków.
Wartość | Opis |
---|---|
CFile::typeBinary |
Ustawia tryb binarny (używany tylko w klasach pochodnych). |
CFile::typeText |
Ustawia tryb tekstowy ze specjalnym przetwarzaniem dla par zestawienia powrotu karetki (używane tylko w klasach pochodnych). |
CFile::typeUnicode |
Ustawia tryb Unicode (używany tylko w klasach pochodnych). Tekst jest zapisywany w pliku w formacie Unicode, gdy aplikacja jest wbudowana w konfigurację Unicode. Żaden element BOM nie jest zapisywany w pliku. |
Wybierz tylko jedną z następujących opcji trybu udziału plików. Domyślny tryb udziału plików to CFile::shareExclusive
, który jest wyłączny.
Wartość | Opis |
---|---|
CFile::shareDenyNone |
Brak ograniczeń udostępniania. |
CFile::shareDenyRead |
Odmawia dostępu do odczytu wszystkim innym osobom. |
CFile::shareDenyWrite |
Odmowa dostępu do zapisu we wszystkich innych. |
CFile::shareExclusive |
Odmawia dostępu do odczytu i zapisu we wszystkich innych. |
Wybierz pierwszą lub obie z następujących opcji trybu tworzenia plików. Domyślnym trybem tworzenia jest CFile::modeNoTruncate
, który jest otwarty w istniejącej.
Wartość | Opis |
---|---|
CFile::modeCreate |
Tworzy nowy plik, jeśli plik nie istnieje. Jeśli plik już istnieje, zostanie zastąpiony i początkowo ustawiony na zero długości. |
CFile::modeNoTruncate |
Tworzy nowy plik, jeśli nie istnieje plik; w przeciwnym razie, jeśli plik już istnieje, jest on dołączony do CFile obiektu. |
Wybierz następujące opcje buforowania plików zgodnie z opisem. Domyślnie system używa schematu buforowania ogólnego przeznaczenia, który nie jest dostępny jako opcja.
Wartość | Opis |
---|---|
CFile::osNoBuffer |
System nie używa pośredniej pamięci podręcznej dla pliku. Ta opcja anuluje następujące 2 opcje. |
CFile::osRandomAccess |
Pamięć podręczna plików jest zoptymalizowana pod kątem dostępu losowego. Nie używaj tej opcji i opcji skanowania sekwencyjnego. |
CFile::osSequentialScan |
Pamięć podręczna plików jest zoptymalizowana pod kątem dostępu sekwencyjnego. Nie używaj tej opcji i opcji dostępu losowego. |
CFile::osWriteThrough |
Operacje zapisu są wykonywane bez opóźnień. |
Wybierz następującą opcję zabezpieczeń, aby uniemożliwić dziedziczenie dojścia plików. Domyślnie wszystkie nowe procesy podrzędne mogą używać dojścia do plików.
Wartość | Opis |
---|---|
CFile::modeNoInherit |
Zapobiega używaniu uchwytu plików przez wszystkie procesy podrzędne. |
Domyślny konstruktor inicjuje elementy członkowskie, ale nie dołącza pliku do CFile
obiektu. Po użyciu tego konstruktora użyj metody CFile::Open , aby otworzyć plik i dołączyć go do CFile
obiektu.
Konstruktor z jednym parametrem inicjuje elementy członkowskie i dołącza istniejący plik do CFile
obiektu.
Konstruktor z dwoma parametrami inicjuje elementy członkowskie i próbuje otworzyć określony plik. Jeśli ten konstruktor pomyślnie otworzy określony plik, plik jest dołączony do CFile
obiektu. W przeciwnym razie ten konstruktor zgłasza wskaźnik do CInvalidArgException
obiektu. Aby uzyskać więcej informacji na temat obsługi wyjątków, zobacz Wyjątki.
CFile
Jeśli obiekt pomyślnie otworzy określony plik, zamknie ten plik automatycznie, gdy CFile
obiekt zostanie zniszczony. W przeciwnym razie należy jawnie zamknąć plik po tym, jak nie jest już dołączony do CFile
obiektu.
Przykład
Poniższy kod pokazuje, jak używać .CFile
HANDLE hFile = CreateFile(_T("CFile_File.dat"),
GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("Couldn't create the file!"));
}
else
{
// Attach a CFile object to the handle we have.
CFile myFile(hFile);
static const TCHAR sz[] = _T("I love CFile!");
// write string
myFile.Write(sz, sizeof(sz));
// We need to call Close() explicitly. Note that there's no need to
// call CloseHandle() on the handle returned by the API because
// Close() automatically calls CloseHandle() for us.
myFile.Close();
CFile::Close
Zamyka plik skojarzony z tym obiektem i sprawia, że plik jest niedostępny do odczytu lub zapisu.
virtual void Close();
Uwagi
Jeśli plik nie został zamknięty przed zniszczeniem obiektu, destruktor zamknie go za Ciebie.
Jeśli został użyty new
do przydzielenia CFile
obiektu na stercie, należy go usunąć po zamknięciu pliku. Close
ustawia wartość m_hFile
CFile::hFileNull
.
Przykład
Zobacz przykład dla pliku CFile::CFile.
CFile::D uplicate
Tworzy zduplikowany CFile
obiekt dla danego pliku.
virtual CFile* Duplicate() const;
Wartość zwracana
Wskaźnik do zduplikowanego CFile
obiektu.
Uwagi
Ta funkcja jest równoważna funkcji _dup
czasu wykonywania języka C .
CFile::Flush
Wymusza zapisanie wszystkich danych w buforze plików.
virtual void Flush();
Uwagi
Użycie Flush
funkcji nie gwarantuje opróżniania CArchive
. Jeśli używasz archiwum, najpierw wywołaj metodę CArchive::Flush .
Przykład
Zobacz przykład CFile::SetFilePath.
CFile::GetFileName
Wywołaj tę funkcję składową, aby pobrać nazwę określonego pliku.
virtual CString GetFileName() const;
Wartość zwracana
Nazwa pliku.
Uwagi
Na przykład po wywołaniu GetFileName
wywołania w celu wygenerowania komunikatu dla użytkownika o pliku c:\windows\write\myfile.wri
, zwracana jest nazwa pliku myfile.wri
, .
Aby zwrócić całą ścieżkę pliku, w tym nazwę, wywołaj metodę GetFilePath. Aby zwrócić tytuł pliku ( myfile
), wywołaj metodę GetFileTitle.
Przykład
Ten fragment kodu otwiera system. Plik INI w katalogu systemu WINDOWS. Jeśli zostanie znaleziony, w przykładzie zostanie wyświetlona nazwa i ścieżka i tytuł, jak pokazano w obszarze Dane wyjściowe:
try
{
// try to open the file
CFile sysFile(_T("C:\\WINDOWS\\SYSTEM.INI"), CFile::modeRead);
// print out path name and title information
_tprintf_s(_T("Path is : \"%s\"\n"),
(LPCTSTR) sysFile.GetFilePath());
_tprintf_s(_T("Name is : \"%s\"\n"),
(LPCTSTR) sysFile.GetFileName());
_tprintf_s(_T("Title is: \"%s\"\n"),
(LPCTSTR) sysFile.GetFileTitle());
// close the file handle
sysFile.Close();
}
catch (CFileException* pEx)
{
// if an error occurs, just make a message box
pEx->ReportError();
pEx->Delete();
}
CFile::GetFilePath
Wywołaj tę funkcję składową, aby pobrać pełną ścieżkę określonego pliku.
virtual CString GetFilePath() const;
Wartość zwracana
Pełna ścieżka określonego pliku.
Uwagi
Na przykład po wywołaniu GetFilePath
wywołania w celu wygenerowania komunikatu do użytkownika o pliku , zwracana jest ścieżka c:\windows\write\myfile.wri
pliku c:\windows\write\myfile.wri
.
Aby zwrócić tylko nazwę pliku (myfile.wri
), wywołaj metodę GetFileName. Aby zwrócić tytuł pliku (myfile
), wywołaj metodę GetFileTitle.
Przykład
CFile::GetFileTitle
Wywołaj tę funkcję składową, aby pobrać tytuł pliku (nazwę wyświetlaną) pliku.
virtual CString GetFileTitle() const;
Wartość zwracana
Tytuł pliku bazowego.
Uwagi
Ta metoda wywołuje metodę GetFileTitle , aby pobrać tytuł pliku. Jeśli operacja powiedzie się, metoda zwróci ciąg, którego system użyje do wyświetlenia nazwy pliku użytkownikowi. W przeciwnym razie metoda wywołuje metodę PathFindFileName , aby pobrać nazwę pliku (w tym rozszerzenie pliku) pliku bazowego. Oznacza to, że rozszerzenie pliku nie zawsze jest uwzględniane w zwracanym ciągu tytułu pliku. Aby uzyskać więcej informacji, zobacz GetFileTitle i PathFindFileName w zestawie Windows SDK.
Aby zwrócić całą ścieżkę pliku, w tym nazwę, wywołaj metodę GetFilePath. Aby zwrócić tylko nazwę pliku, wywołaj metodę GetFileName.
Przykład
CFile::GetLength
Uzyskuje bieżącą długość logiczną pliku w bajtach.
virtual ULONGLONG GetLength() const;
Wartość zwracana
Długość pliku.
Przykład
CFile* pFile = NULL;
// Constructing a CFile object with this override may throw
// a CFile exception, and won't throw any other exceptions.
// Calling CString::Format() may throw a CMemoryException,
// so we have a catch block for such exceptions, too. Any
// other exception types this function throws will be
// routed to the calling function.
try
{
pFile = new CFile(_T("C:\\WINDOWS\\SYSTEM.INI"),
CFile::modeRead | CFile::shareDenyNone);
ULONGLONG dwLength = pFile->GetLength();
CString str;
str.Format(_T("Your SYSTEM.INI file is %I64u bytes long."), dwLength);
AfxMessageBox(str);
}
catch (CFileException* pEx)
{
// Simply show an error message to the user.
pEx->ReportError();
pEx->Delete();
}
catch(CMemoryException* pEx)
{
pEx->ReportError();
pEx->Delete();
// We can't recover from this memory exception, so we'll
// just terminate the app without any cleanup. Normally,
// an application should do everything it possibly can to
// clean up properly and _not_ call AfxAbort().
AfxAbort();
}
// If an exception occurs in the CFile constructor,
// the language will free the memory allocated by new
// and will not complete the assignment to pFile.
// Thus, our clean-up code needs to test for NULL.
if (pFile != NULL)
{
pFile->Close();
delete pFile;
}
CFile::GetPosition
Uzyskuje bieżącą wartość wskaźnika pliku, która może być używana w kolejnych wywołaniach metody .Seek
virtual ULONGLONG GetPosition() const;
Wartość zwracana
Wskaźnik pliku.
Przykład
CFile cfile;
cfile.Open(_T("Seek_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
LONGLONG lOffset = 1000;
ULONGLONG lActual;
lActual = cfile.Seek(lOffset, CFile::begin);
ASSERT(cfile.GetPosition() == lActual);
CFile::GetStatus
Ta metoda pobiera informacje o stanie związane z danym CFile
wystąpieniem obiektu lub daną ścieżką pliku.
BOOL GetStatus(CFileStatus& rStatus) const;
static BOOL PASCAL GetStatus(
LPCTSTR lpszFileName,
CFileStatus& rStatus,
CAtlTransactionManager* pTM = NULL);
Parametry
rStatus
Odwołanie do struktury dostarczonej przez CFileStatus
użytkownika, która będzie otrzymywać informacje o stanie. Struktura CFileStatus
ma następujące pola:
CTime m_ctime
Data i godzina utworzenia pliku.CTime m_mtime
Data i godzina ostatniej modyfikacji pliku.CTime m_atime
Data i godzina ostatniego dostępu do pliku do odczytu.ULONGLONG m_size
Logiczny rozmiar pliku w bajtach zgłoszony przez polecenie DIR.BYTE m_attribute
Bajt atrybutu pliku.char m_szFullName[_MAX_PATH]
Bezwzględna nazwa pliku w zestawie znaków systemu Windows.
lpszFileName
Ciąg w zestawie znaków systemu Windows, który jest ścieżką do żądanego pliku. Ścieżka może być względna lub bezwzględna lub może zawierać nazwę ścieżki sieciowej.
pTM
Wskaźnik do obiektu CAtlTransactionManager
Wartość zwracana
WARTOŚĆ TRUE, jeśli informacje o stanie określonego pliku zostały pomyślnie uzyskane; w przeciwnym razie, FAŁSZ.
Uwagi
Wersja GetStatus
niestatyczna pobiera informacje o stanie otwartego pliku skojarzonego z danym CFile
obiektem. Statyczna wersja GetStatus
pliku uzyskuje stan pliku z danej ścieżki pliku bez faktycznego otwierania pliku. Ta wersja jest przydatna do testowania istnienia i praw dostępu do pliku.
Element m_attribute
członkowski CFileStatus
struktury odwołuje się do zestawu atrybutów pliku. Klasa CFile
udostępnia typ wyliczenia atrybutów, dzięki czemu atrybuty pliku można określić symbolicznie:
enum Attribute {
normal = 0x00,
readOnly = 0x01,
hidden = 0x02,
system = 0x04,
volume = 0x08,
directory = 0x10,
archive = 0x20
};
Przykład
CFile cfile;
cfile.Open(_T("SetLength_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
ULONGLONG dwNewLength = 10000;
cfile.SetLength(dwNewLength);
CFileStatus status;
if(cfile.GetStatus(status)) // virtual member function
{
TRACE(_T("File size = %u\n"), status.m_size);
}
TCHAR* pszFileName = _T("SetLength_File.dat");
if(CFile::GetStatus(pszFileName, status)) // static function
{
TRACE(_T("Full file name = %s\n"), status.m_szFullName);
}
CFile::hFileNull
Określa obecność prawidłowego uchwytu CFile
pliku dla obiektu.
static AFX_DATA const HANDLE hFileNull;
Uwagi
Ta stała służy do określania CFile
, czy obiekt ma prawidłowy uchwyt pliku.
W poniższym przykładzie pokazano tę operację:
if (myFile.m_hFile != CFile::hFileNull)
;//perform operations on the file
else
;//indicate the presence of an invalid handle
CFile::LockRange
Blokuje zakres bajtów w otwartym pliku, zgłaszając wyjątek, jeśli plik jest już zablokowany.
virtual void LockRange(
ULONGLONG dwPos,
ULONGLONG dwCount);
Parametry
dwPos
Przesunięcie bajtu początku zakresu bajtów w celu zablokowania.
dwCount
Liczba bajtów w zakresie do zablokowania.
Uwagi
Blokowanie bajtów w pliku uniemożliwia dostęp do tych bajtów przez inne procesy. Możesz zablokować więcej niż jeden region pliku, ale nie są dozwolone żadne nakładające się regiony.
Po odblokowaniu regionu przy użyciu funkcji składowej UnlockRange
zakres bajtów musi odpowiadać dokładnie regionowi, który został wcześniej zablokowany. Funkcja LockRange
nie scala sąsiednich regionów. Jeśli sąsiadują dwa zablokowane regiony, musisz oddzielnie odblokować każdy region.
Uwaga
Ta funkcja nie jest dostępna dla klasy pochodnej CMemFile
.
Przykład
CFile cfile;
cfile.Open(_T("LockRange_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
ULONGLONG dwPos = 10;
ULONGLONG dwCount = 100;
cfile.LockRange(dwPos, dwCount);
// do something with the file
cfile.UnlockRange(dwPos, dwCount);
CFile::m_hFile
Zawiera dojście do plików systemu operacyjnego dla otwartego pliku.
HANDLE m_hFile;
Uwagi
m_hFile
jest publiczną zmienną typu UINT. Zawiera CFile::hFileNull
on , niezależny od systemu operacyjnego pusty wskaźnik pliku, jeśli dojście nie zostało przypisane.
Użycie elementu m_hFile
nie jest zalecane, ponieważ znaczenie elementu członkowskiego zależy od klasy pochodnej. m_hFile
jest częścią publiczną dla wygody w obsłudze niepolymorficznego użycia klasy.
CFile::m_pTM
Wskaźnik do CAtlTransactionManager
obiektu.
CAtlTransactionManager* m_pTM;
Uwagi
CFile::Open
Przeciążone. Open
jest przeznaczony do użycia z konstruktorem domyślnym CFile
.
virtual BOOL Open(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CFileException* pError = NULL);
virtual BOOL Open(
LPCTSTR lpszFileName,
UINT nOpenFlags,
CAtlTransactionManager* pTM,
CFileException* pError = NULL);
Parametry
lpszFileName
Ciąg zawierający ścieżkę do żądanego pliku. Ścieżka może być względna, bezwzględna lub nazwa sieci (UNC).
nOpenFlags
Funkcja UINT, która definiuje tryb udostępniania i dostępu do pliku. Określa akcję do wykonania podczas otwierania pliku. Opcje można połączyć za pomocą operatora bitowego OR ( ). |
Wymagane jest jedno uprawnienie dostępu i jedna opcja udziału; modeCreate
tryby i modeNoInherit
są opcjonalne. Zobacz konstruktor CFile, aby uzyskać listę opcji trybu.
pError
Wskaźnik do istniejącego obiektu wyjątku pliku, który otrzyma stan operacji, która zakończy się niepowodzeniem.
pTM
Wskaźnik do obiektu CAtlTransactionManager
Wartość zwracana
Nonzero, jeśli otwarcie zakończyło się pomyślnie; w przeciwnym razie 0. Parametr pError ma znaczenie tylko wtedy, gdy zostanie zwrócona wartość 0.
Uwagi
Dwie Open
funkcje są "bezpiecznymi" metodami otwierania pliku, gdzie awaria jest normalnym, oczekiwanym warunkiem.
CFile
Podczas gdy konstruktor zgłasza wyjątek w warunku błędu, Open
zwraca wartość FALSE dla warunków błędu. Open
Nadal można zainicjować obiekt CFileException w celu opisania błędu. Jeśli nie podasz parametru pError lub jeśli przekażesz wartość NULL dla błędu pError, Open
zwraca wartość FALSE i nie zgłasza wartości CFileException
. Jeśli wskaźnik zostanie przekazany do istniejącego CFileException
elementu i Open
napotka błąd, funkcja wypełni ją informacjami opisującym ten błąd. Open
nie zgłasza wyjątku w obu przypadkach.
W poniższej tabeli opisano możliwe wyniki .Open
pError |
Napotkano błąd | Wartość zwracana | Zawartość CFileException |
---|---|---|---|
NULL | Nie. | PRAWDA | nie dotyczy |
ptr do CFileException |
Nie. | PRAWDA | Niezmienione |
NULL | Tak | FAŁSZ | nie dotyczy |
ptr do CFileException |
Tak | FAŁSZ | zainicjowane w celu opisania błędu |
Przykład
CFile f;
CFileException e;
TCHAR* pszFileName = _T("Open_File.dat");
if(!f.Open(pszFileName, CFile::modeCreate | CFile::modeWrite, &e))
{
TRACE(_T("File could not be opened %d\n"), e.m_cause);
}
//A second example for CFile::Open.
//This function uses CFile to copy binary files.
bool BinaryFileCopy(LPCTSTR pszSource, LPCTSTR pszDest)
{
// constructing these file objects doesn't open them
CFile sourceFile;
CFile destFile;
// we'll use a CFileException object to get error information
CFileException ex;
// open the source file for reading
if (!sourceFile.Open(pszSource,
CFile::modeRead | CFile::shareDenyWrite, &ex))
{
// complain if an error happened
// no need to delete the ex object
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
_tprintf_s(_T("Couldn't open source file: %1024s"), szError);
return false;
}
else
{
if (!destFile.Open(pszDest, CFile::modeWrite |
CFile::shareExclusive | CFile::modeCreate, &ex))
{
TCHAR szError[1024];
ex.GetErrorMessage(szError, 1024);
_tprintf_s(_T("Couldn't open source file: %1024s"), szError);
sourceFile.Close();
return false;
}
BYTE buffer[4096];
DWORD dwRead;
// Read in 4096-byte blocks,
// remember how many bytes were actually read,
// and try to write that many out. This loop ends
// when there are no more bytes to read.
do
{
dwRead = sourceFile.Read(buffer, 4096);
destFile.Write(buffer, dwRead);
}
while (dwRead > 0);
// Close both files
destFile.Close();
sourceFile.Close();
}
return true;
}
CFile::operator HANDLE
Użyj tego operatora, aby przekazać uchwyt do obiektu do CFile
funkcji, takich jak ReadFileEx i GetFileTime, które oczekują .HANDLE
operator HANDLE() const;
CFile::Read
Odczytuje dane do buforu z pliku skojarzonego z obiektem CFile
.
virtual UINT Read(
void* lpBuf,
UINT nCount);
Parametry
lpBuf
Wskaźnik do buforu dostarczonego przez użytkownika, który ma odbierać dane odczytane z pliku.
nCount
Maksymalna liczba bajtów do odczytu z pliku. W przypadku plików w trybie tekstowym pary zestawienia powrotu karetki są liczone jako pojedyncze znaki.
Wartość zwracana
Liczba bajtów przesłanych do buforu. W przypadku wszystkich CFile
klas wartość zwracana może być mniejsza niż nCount , jeśli osiągnięto koniec pliku.
Przykład
CFile cfile;
cfile.Open(_T("Write_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
char pbufWrite[100];
memset(pbufWrite, 'a', sizeof(pbufWrite));
cfile.Write(pbufWrite, 100);
cfile.Flush();
cfile.SeekToBegin();
char pbufRead[100];
cfile.Read(pbufRead, sizeof(pbufRead));
ASSERT(0 == memcmp(pbufWrite, pbufRead, sizeof(pbufWrite)));
Aby zapoznać się z innym przykładem, zobacz CFile::Open.
CFile::Remove
Ta funkcja statyczna usuwa plik określony przez ścieżkę.
static void PASCAL Remove(
LPCTSTR lpszFileName,
CAtlTransactionManager* pTM = NULL);
Parametry
lpszFileName
Ciąg, który jest ścieżką do żądanego pliku. Ścieżka może być względna lub bezwzględna i może zawierać nazwę sieci.
pTM
Wskaźnik do obiektu CAtlTransactionManager
Uwagi
Remove
nie spowoduje usunięcia katalogu.
Funkcja Remove
składowa zgłasza wyjątek, jeśli połączony plik jest otwarty lub nie można usunąć pliku. Ta funkcja jest odpowiednikiem polecenia DEL.
Przykład
//example for CFile::Remove
TCHAR* pFileName = _T("Remove_File.dat");
try
{
CFile::Remove(pFileName);
}
catch (CFileException* pEx)
{
TRACE(_T("File %20s cannot be removed\n"), pFileName);
pEx->Delete();
}
CFile::Rename
Ta funkcja statyczna zmienia nazwę określonego pliku.
static void PASCAL Rename(
LPCTSTR lpszOldName,
LPCTSTR lpszNewName,
CAtlTransactionManager* pTM = NULL);
Parametry
lpszOldName
Stara ścieżka.
lpszNewName
Nowa ścieżka.
pTM
Wskaźnik do obiektu CAtlTransactionManager
Uwagi
Nie można zmienić nazwy katalogów. Ta funkcja jest odpowiednikiem polecenia REN.
Przykład
TCHAR* pOldName = _T("Oldname_File.dat");
TCHAR* pNewName = _T("Renamed_File.dat");
try
{
CFile::Rename(pOldName, pNewName);
}
catch(CFileException* pEx )
{
TRACE(_T("File %20s not found, cause = %d\n"), pOldName,
pEx->m_cause);
pEx->Delete();
}
CFile::Seek
Zmienia położenie wskaźnika pliku w otwartym pliku.
virtual ULONGLONG Seek(
LONGLONG lOff,
UINT nFrom);
Parametry
lOff
Liczba bajtów do przeniesienia wskaźnika pliku. Wartości dodatnie przenoszą wskaźnik pliku na końcu pliku; wartości ujemne przenoszą wskaźnik pliku do początku pliku.
nFrom
Pozycja do poszukiwania od. Zobacz sekcję Uwagi, aby uzyskać możliwe wartości.
Wartość zwracana
Położenie wskaźnika pliku, jeśli metoda zakończyła się pomyślnie; w przeciwnym razie zwracana wartość jest niezdefiniowana, a wskaźnik do wyjątku CFileException
jest zgłaszany.
Uwagi
W poniższej tabeli wymieniono możliwe wartości parametru nFrom .
Wartość | Opis |
---|---|
CFile::begin |
Szukaj od początku pliku. |
CFile::current |
Poszukaj z bieżącej lokalizacji wskaźnika pliku. |
CFile::end |
Poszukaj na końcu pliku. |
Po otwarciu pliku wskaźnik pliku jest umieszczony na 0, początek pliku.
Wskaźnik pliku można ustawić na pozycję poza końcem pliku. Jeśli tak, rozmiar pliku nie zwiększa się, dopóki nie zostanie zapisana w pliku.
Program obsługi wyjątków dla tej metody musi usunąć obiekt wyjątku po przetworzeniu wyjątku.
Przykład
CFile cfile;
cfile.Open(_T("Seek_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
LONGLONG lOffset = 1000;
ULONGLONG lActual;
lActual = cfile.Seek(lOffset, CFile::begin);
CFile::SeekToBegin
Ustawia wartość wskaźnika pliku na początek pliku.
void SeekToBegin();
Uwagi
SeekToBegin()
jest równoważne z Seek( 0L, CFile::begin )
.
Przykład
CFile f;
f.Open(_T("Seeker_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
f.SeekToBegin();
ULONGLONG ullEnd = f.SeekToEnd();
CFile::SeekToEnd
Ustawia wartość wskaźnika pliku na logiczny koniec pliku.
ULONGLONG SeekToEnd();
Wartość zwracana
Długość pliku w bajtach.
Uwagi
SeekToEnd()
jest równoważne z CFile::Seek( 0L, CFile::end )
.
Przykład
CFile f;
f.Open(_T("Seeker_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
f.SeekToBegin();
ULONGLONG ullEnd = f.SeekToEnd();
CFile::SetFilePath
Wywołaj tę funkcję, aby określić ścieżkę pliku. Jeśli na przykład ścieżka pliku nie jest dostępna w przypadku konstruowania obiektu CFile , wywołaj metodę SetFilePath
, aby ją podać.
virtual void SetFilePath(LPCTSTR lpszNewName);
Parametry
lpszNewName
Wskaźnik do ciągu określającego nową ścieżkę.
Uwagi
Uwaga
SetFilePath
nie otwiera pliku ani nie tworzy pliku; po prostu kojarzy CFile
obiekt z nazwą ścieżki, której następnie można użyć.
Przykład
TCHAR* pstrName = _T("C:\\test\\SetPath_File.dat");
// open a file
HANDLE hFile = ::CreateFile(pstrName, GENERIC_WRITE, FILE_SHARE_READ,
NULL, CREATE_ALWAYS, 0, NULL);
if (hFile != INVALID_HANDLE_VALUE)
{
// attach a CFile object to it
CFile myFile(hFile);
// At this point, myFile doesn't know the path name for the file
// it owns because Windows doesn't associate that information
// with the handle. Any CFileExceptions thrown by this object
// won't have complete information.
// Calling SetFilePath() remedies that problem by letting CFile
// know the name of the file that's associated with the object.
myFile.SetFilePath(pstrName);
// write something to the file and flush it immediately
DWORD dwValue = 1234;
myFile.Write(&dwValue, sizeof(dwValue));
myFile.Flush();
// destroying the CObject here will call ::CloseHandle() on the file
}
CFile::SetLength
Wywołaj tę funkcję, aby zmienić długość pliku.
virtual void SetLength(ULONGLONG dwNewLen);
Parametry
dwNewLen
Żądana długość pliku w bajtach. Ta wartość może być większa lub mniejsza niż bieżąca długość pliku. Plik zostanie rozszerzony lub obcięty zgodnie z potrzebami.
Uwagi
Uwaga
W przypadku CMemFile
funkcji ta funkcja może zgłosić CMemoryException
obiekt.
Przykład
CFile cfile;
cfile.Open(_T("SetLength_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
ULONGLONG dwNewLength = 10000;
cfile.SetLength(dwNewLength);
CFile::SetStatus
Ustawia stan pliku skojarzonego z tą lokalizacją pliku.
static void PASCAL SetStatus(
LPCTSTR lpszFileName,
const CFileStatus& status,
CAtlTransactionManager* pTM = NULL);
Parametry
lpszFileName
Ciąg, który jest ścieżką do żądanego pliku. Ścieżka może być względna lub bezwzględna i może zawierać nazwę sieci.
status
Bufor zawierający nowe informacje o stanie. Wywołaj funkcję składową GetStatus
, aby wstępnie wypełnić CFileStatus
strukturę bieżącymi wartościami, a następnie wprowadzić zmiany zgodnie z potrzebami. Jeśli wartość to 0, odpowiedni element stanu nie zostanie zaktualizowany. Aby uzyskać opis CFileStatus
struktury, zobacz funkcję składową GetStatus.
pTM
Wskaźnik do obiektu CAtlTransactionManager
Uwagi
Aby ustawić czas, zmodyfikuj m_mtime
pole stanu.
W przypadku wywołania SetStatus
metody w celu zmiany tylko atrybutów pliku, a m_mtime
element członkowski struktury stanu pliku nie jestzerowy, atrybuty mogą również mieć wpływ (zmiana sygnatury czasowej może mieć wpływ na atrybuty). Jeśli chcesz zmienić tylko atrybuty pliku, najpierw ustaw m_mtime
element członkowski struktury stanu pliku na zero, a następnie wywołaj metodę SetStatus
.
Przykład
TCHAR* pFileName = _T("ReadOnly_File.dat");
CFileStatus status;
CFile::GetStatus(pFileName, status);
status.m_attribute |= CFile::readOnly;
CFile::SetStatus(pFileName, status);
CFile::UnlockRange
Odblokuje zakres bajtów w otwartym pliku.
virtual void UnlockRange(
ULONGLONG dwPos,
ULONGLONG dwCount);
Parametry
dwPos
Przesunięcie bajtu początku zakresu bajtów do odblokowania.
dwCount
Liczba bajtów w zakresie do odblokowania.
Uwagi
Aby uzyskać szczegółowe informacje, zobacz opis funkcji składowej LockRange .
Uwaga
Ta funkcja nie jest dostępna dla klasy -pochodnej CMemFile
.
Przykład
CFile cfile;
cfile.Open(_T("LockRange_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
ULONGLONG dwPos = 10;
ULONGLONG dwCount = 100;
cfile.LockRange(dwPos, dwCount);
// do something with the file
cfile.UnlockRange(dwPos, dwCount);
CFile::Write
Zapisuje dane z buforu do pliku skojarzonego z obiektem CFile
.
virtual void Write(
const void* lpBuf,
UINT nCount);
Parametry
lpBuf
Wskaźnik do buforu dostarczonego przez użytkownika, który zawiera dane do zapisania w pliku.
nCount
Liczba bajtów, które mają zostać przeniesione z buforu. W przypadku plików w trybie tekstowym pary zestawienia powrotu karetki są liczone jako pojedyncze znaki.
Uwagi
Write
zgłasza wyjątek w odpowiedzi na kilka warunków, w tym warunek pełny dysku.
Przykład
CFile cfile;
cfile.Open(_T("Write_File.dat"), CFile::modeCreate |
CFile::modeReadWrite);
char pbufWrite[100];
memset(pbufWrite, 'a', sizeof(pbufWrite));
cfile.Write(pbufWrite, 100);
cfile.Flush();
Zobacz również przykłady plików CFile::CFile i CFile::Open.
Zobacz też
Przykład MFC DRAWCLI
Klasa CObject
Wykres hierarchii
Klasa CStdioFile
Klasa CMemFile