logo

Fayl va kataloglar bilan ishlash jarayonlarini dasturlash

Yuklangan vaqt:

08.08.2023

Ko'chirishlar soni:

0

Hajmi:

563.2109375 KB
Mavzu: Fayl va kataloglar bilan ishlash jarayonlarini dasturlash
Reja:
1. Qt dasturlash muhitida  fayl va kataloglar bilan ishlash. 
2. Fayl va kataloglar bilan ishlashda qidiruv,saralash algoritmlari bilan ishlash 
va dasturlash. 
3. Fayl va kataloglarni tanlash va tarkibini ko’rsatish jarayonlarini dasturlash.
  1. Qt dasturlash muhitida  fayl va kataloglar bilan ishlash.
                    Kataloglar   (yoki   papkalar,   Windows   terminologiyasida)   va   fayllar   bilan
ishlash   barcha   operatsion   platformalarda   mustaqil   bo'lmagan   sohadir,   shuning
uchun   Qt   quyidagi   sinflarga   asoslanib   bunday   operatsiyalar   uchun   o'z   yordamini
beradi:
♦ QDir - kataloglar bilan ishlash uchun;
♦ QFile - fayllar bilan ishlash uchun;
♦ QFileinfo - fayl haqida ma'lumot olish uchun;
♦ QiODevice - kirish / chiqish uchun mavhum sinf;
♦ QBuffer - fayllarni kompyuter xotirasida aks ettirish uchun.
Kirish chiqish. QiODevice sinfi
        QiODevice sinfi - bu kirish / chiqish qurilmasini ochish va yopish uchun 
virtual usullarni o'z ichiga olgan, ma'lumot bloklarini yoki individual belgilarni 
o'qish va yozish uchun kirish / o'chirish moslamasini yaratadigan mavhum sinf.
Muayyan qurilmani amalga oshirish meros qolgan sinflarda sodir bo'ladi. Qt 
QiODevice sinfini meros qilib oladigan to'rtta sinfga ega:
♦ QFile - fayllar bilan operatsiyalarni bajarish uchun sinf;
♦ QBuffer - QByteArray-ga ma'lumot yozishga va o'qishga imkon beradigan 
bufer sinf;
♦ QAbstractSocket - rozetkalar orqali tarmoq aloqasi uchun tayanch sinf;
♦ QProcess - bu qo'shimcha dalillar bilan jarayonlarni boshlash qobiliyatini 
ta'minlaydigan va QiODevice-da belgilangan usullar yordamida ushbu jarayonlar 
bilan aloqa qilish imkonini beradigan sinf.
Qurilma bilan ishlash uchun uni QiODevice sinfining sarlavha faylida belgilangan 
rejimlardan birida ochish kerak:
♦ QiODevice :: NotOpen - qurilma ochiq emas (bu qiymatni ochiq () usuliga 
o'tkazish mantiqiy emas);
♦ QiODevice :: Readonly - faqat ma'lumotlarni o'qish uchun ochiq qurilma;
♦ QiODevice :: WriteOnly - faqat ma'lumot yozish uchun qurilmani ochish; ♦ QiODevice :: ReadWrite - ma'lumotlarni o'qish va yozish uchun qurilma 
ochish (Readonly | writeOnly kabi);
♦ QiODevice :: Append - ma'lumotlarni qo'shish uchun ochiq qurilma;
♦ QiODevice: Buferlanmagan - o'qish va yozish oralig'ini chetlab o'tib, 
ma'lumotlarga to'g'ridan-to'g'ri kirish uchun ochilish;
♦ QiODevice :: Matn - platformaga bog'liq holda satrlarni ajratish belgilarini 
o'zgartirish uchun ishlatiladi. Windows "\ r \ n", MacOS X va Unix "\ r" dan 
foydalanadi;
♦ QiODevice :: Kesib oling - barcha ma'lumotlar, agar iloji bo'lsa, ochilish 
paytida o'chirilishi kerak.
Dastur   bajarilishining   istalgan   vaqtida   qurilma   qaysi   rejimda   ochilganligini
bilish uchun openMode() usulini chaqirish kerak.
Siz   read()   va   write()   usullari   yordamida   ma'lumotlarni   o'qishingiz   va
yozishingiz   mumkin.   Bir   vaqtning   o'zida   barcha   ma'lumotlarni   o'qish   uchun
readAll()   usuli   aniqlanadi,   bu   ularni   QByteArray   turidagi   ob'ektga   qaytaradi.Bir
satr   yoki   belgi   mos   ravishda   readLine   ()   va   getChar   ()   usullari   bilan   o'qilishi
mumkin.
QiODevice   sinfi   joriy   pozitsiyani   o'zgartirish   usulini   belgilaydi:seek().   Siz
joriy   pozitsiyani   pos   o   usuliga   murojaat   qilib   olishingiz   mumkin.   Ammo   esda
tutingki,   ushbu   usullar   faqat   to'g'ridan-to'g'ri   ma'lumotlarga   kirish   uchun
qo'llaniladi.   Tarmoq   ulanishi   bo'lgan   ketma-ket   kirish   bilan   ular   o'zlarining
ma'nolarini yo'qotadilar. Bundan tashqari, bu holda qurilma ma'lumotlarini hajmini
qaytaradigan   size   ()   usuli   ham   ma'qul   emas.   Ushbu   barcha   operatsiyalar   faqat
QFile, QBuffer va QTemporaryFile sinflariga qo'llaniladi.
Qt   qo'llab-quvvatlamaydigan   o'zingizning   kirish/   chiqish   qurilmangiz   sinfini
yaratish uchun siz QiODevice sinfini meros qilib olishingiz va unda readData() va
writeData () usullarini qo'llashingiz kerak. Aksariyat hollarda siz open(), close() va
atEnd() usullarini bekor qilishingiz kerak bo'lishi mumkin.
QiODevice   sinfining   interfeysi   tufayli   barcha   qurilmalar   bilan   bir   xil   tarzda
ishlash   mumkin   va   ish   paytida,   odatda,   qurilma   fayl,   bufer   yoki   boshqa   qurilma bo'ladimi,   farq   qilmaydi.   Masalan,   ushbu   usul   yordamida   har   qanday   qurilmadan
konsolga ma'lumotlarni chiqarish mumkin:
void print(QIODevice* pdev)
{
char ch;
QString str;
pdev->open(QIODevice::Readonly);
for (; !pdev->atEnd();) {
pdev->getChar(&ch);
str += ch;
pdev->close();
qDebug() << str;
             QIODevice klassi  kirish / chiqish qurilmasi to'g'risida ma'lumot olish uchun
ishlatilishi   mumkin   bo'lgan   bir   qator   usullarni   taqdim   etadi.   Masalan,   ba'zi
qurilmalar   faqat   ma'lumot   yozishi   mumkin,   boshqalari   faqat   o'qishi   mumkin,
boshqalari   esa   ikkalasini   ham   bajarishga   qodir.   Qurilma   bilan   ishlashda   qanday
operatsiyalar   mavjudligini   tekshirish   uchun   isReadable()   va   isWriteable   ()
usullaridan foydalaning.
Fayllar bilan ishlash. QFile klassi
QFile   sinfi   QIODevice   sinfidan   meros   bo'lib   o'tgan.   U   fayllar   bilan   ishlash
usullarini   o'z   ichiga   oladi:   ma'lumotlarni   ochish,   yopish,   o'qish   va   yozish.
Konstruktorda fayl nomini o'z ichiga olgan satrni o'tish orqali ob'ekt yaratishingiz
mumkin. Siz konstruktorda hech narsa o'tolmaysiz, lekin uni ob'ektni yaratgandan
so'ng, setName() usulini chaqirib bajaring. Misol uchun:
QFile file;
file.setName("file.dat");
Fayllar   bilan   ishlash   jarayonida   ba'zan   siz   fayl   ochiq   yoki   yo'qligini
bilishingiz kerak. Buning uchun QIODevice :: isOpen() usuli chaqiriladi, agar fayl
ochiq bo'lsa, u haqiqiy bo'lsa, aks holda noto'g'ri bo'ladi. Faylni yopish uchun close
() usuliga murojaat qiling. Yopiq bo'lganda, buferdagi barcha ma'lumotlar yoziladi. Agar   siz   bufer   ma'lumotlarini   faylga   yopmasdan   yozmoqchi   bo'lsangiz,   unda
QFile::flush() usuli chaqiriladi.
Sizga   kerak   bo'lgan   fayl   mavjudligini   QFile::()   statik   usuli   yordamida
tekshirishingiz mumkin.
Ushbu usul faylga to'liq yoki nisbiy yo'lni o'z ichiga olgan satrni qabul qiladi. Agar
fayl   topilsa,   usul   haqiqiy   qaytib   keladi,   aks   holda   -   noto'g'ri.   Ushbu   operatsiyani
bajarish uchun, shuningdek,  statik bo'lmagan  QFile::usuli()  mavjud, u fileName()
usuli   bilan   qaytarilgan   faylning   mavjudligini   tekshiradi.   QIODevice::read()   va
QIODevice  ::write() usullari bloklarga fayllarni o'qish va yozish imkonini beradi.
Fayllar bilan ishlashning ba'zi usullarini qo'llashni namoyish etamiz:
QFile filel("filel.dat");
QFile file2("file2.dat ");
if (file2.exists()) {
//  Файл   уже   существует .  Перезаписать ?
}
if (!filel.open(QIODevice::Readonly)) {
qDebugO  << "Ошибка открытия для чтения";
}
if (!file2.open(QIODevice::WriteOnly)) {
qDebugO  « "Ошибка открытия для записи";
}
char а[1024];
while(!filel.atEnd()) {
int nBlocksize = filel.read(a, sizeof(a));
file2.write(a, nBlocksize);
}
filel.close();
file2.close();
Agar siz bir vaqtning o'zida ma'lumotlarni o'qish yoki yozish kerak bo'lsa, 
unda QIODevice::write() va QIODevice::readAll() usullaridan foydalaning. Barcha ma'lumotlarni QByteArray klassi ob'ektida o'qish va undan boshqa faylga yozish 
mumkin:
QFile file1("filel.dat");
QFile file2("file2.dat");
if  ( file 2. exists ()) {
// Файл уже существует. Перезаписать?
}
if (!filel.open(QIODevice::Readonly)) {
qDebug () « "Ошибка открытия для чтения";
}
if (!file2.open(QIODevice::WriteOnly)) {
qDebugO  « "Ошибка открытия для записи";
}
QByteArray а = file1.readAll();
file2.write(a);
file1.close();
file2.close();
Barcha ma'lumotlarni bir vaqtning o'zida katta hajmdagi fayl bilan o'qish juda
ko'p RAMni talab qilishi mumkin, bu sizga favqulodda holatlarda yoki fayllar kam
joy   egallagan   holatlarda   murojaat   qilishingizni   anglatadi.   Agar   faylda   ortiqcha
ma'lumotlar   mavjud   bo'lsa,   bir   vaqtning   o'zida   butun   faylni   o'qish   uchun   xotira
sarfi  sezilarli  darajada kamaytirilishi  mumkin. Keyin siz QByteArray klassi  bilan
ishlaydigan   qCompress   ()   va   quncompress()   siqish   funktsiyalaridan
foydalanishingiz   mumkin.   Ushbu   funktsiyalar   argument   sifatida   QByteArray
ob'ektini oladi va natijada yangi QByteArray ob'ektini qaytaradi.
QFile   klassida   faylni   o'chirish   uchun   statik   remove()   usuli   mavjud.   Ushbu
usul o'chirilishi kerak bo'lgan faylning to'liq yoki nisbiy yo'lini o'z ichiga olgan satr
uzatilishi kerak.
Kataloglar bilan ishlash. QDir klassi Turli   xil   platformalarda   no'xotni   taqdim   etishning   turli   xil   usullari   mavjud.
Windows   OS   haydovchi   harflarini   o'z   ichiga   oladi,   masalan:   C:   \   Windows   \
System.   UNIX   OS   ildiz   katalogidan   foydalanadi,   masalan:   /   usr   /   bin.   E'tibor
bering,   har   ikkala   ko'rinishdagi   katalog   nomlarini   ajratish   uchun   turli   xil   belgilar
ishlatiladi.   Qt   QDir   sinfiga   kataloglarni   platformadan   mustaqil   ravishda   taqdim
etish imkonini beradi.
Bu sinf quyidagilarni aniqlashga imkon beradigan bir qator statik usullarni o'z
ichiga oladi:
♦ QDir :: current () - joriy dastur katalogi yo'li;
♦ QDir :: root () - ildiz katalogi;
♦ QDir :: drives () - QFileinfo sinf ob'ektiga yo'naltiruvchi, tugunli kataloglari
bo'lgan ro'yxat (Windows OS uchun bu C: \, D: \ va hokazo);
♦ QDir :: home () - foydalanuvchining shaxsiy ma'lumotnomasi.
QDir   sinfi   dastur   ishga   tushirilgan   katalogni   aniqlash   usullarini
ta'minlamaydi. Agar siz ushbu yo'lni  topishingiz kerak bo'lsa,  siz QApplication ::
applicationDirPath   ()   usulini   yoki   QApplication   ::   applicationFilePath   ()   usulini
ishlatishingiz kerak, bu ham dastur nomini qaytaradi.
Katalogning   mavjudligini   (()   usuli   yordamida   tekshirish   mumkin.
Kataloglarni   navigatsiya   qilish   uchun   siz   parametr   sifatida   katalog   yo'lini
uzatuvchi cd () usulidan yoki cdup () usulidan foydalanishingiz mumkin. Cd ("..")
usuliga   murojaat   qilish,   cdup   ()   usulini   chaqirishga   teng,   ikkala   usul   ham
operatsiya muvaffaqiyatli bo'lganligini ko'rsatadigan mantiqiy qiymatni qaytaradi.
Nisbatan katalog yo'lini mutlaqo boshqasiga o'zgartirish uchun siz 
makeAbsolute() usuliga murojaat qilishingiz mumkin.
Katalog yaratish uchun mkdir () usuliga murojaat qiling. Agar operatsiya 
muvaffaqiyatli bo'lsa, usul haqiqiy bo'ladi, agar bajarilmasa - noto'g'ri.
Agar fayl yoki katalogning nomini o'zgartirish kerak bo'lsa, u holda rename ()
usulidan foydalaning. Ushbu usulning birinchi parametri - eski ipni, ikkinchisi - 
yangisini o'tkazish. Agar operatsiya muvaffaqiyatli bo'lsa, usul haqiqiy qaytib 
keladi, aks holda - noto'g'ri. Bo'sh kataloglar rmdir() usuli bilan olib tashlanadi, u yo'lni oladi va 
muvaffaqiyatli bo'lsa true qaytaradi, agar bo'lmasa - false.
2. Fayl va kataloglar bilan ishlashda qidiruv,saralash algoritmlari bilan
ishlash va dasturlash.
Quyidagi dasturda ko'rsatilgan FileFinder sinfining konstruktorida bir qatorli
va   ko'p   satrli   matn   maydonlariga   vidjetlar   yaratildi   (ko'rsatgichlar   m_ptxtDir,
m_ptxtMask   va   m_ptxtResuit).   Birinchi   vidjet   QDir::absolyutPath()   usuli   bilan
qaytarilgan mutlaq yo'l bilan initsiallashtiriladi, o'z navbatida boshlang'ich qiymat
bilan. QDir ::current() tomonidan qaytarilgan joriy katalog. Ikkinchi vidjet topilgan
fayllarni filtrlash uchun mo'ljallangan satr bilan ishga tushiriladi. Katalogni tanlash
oynasini   ochish   va   qidiruvni   boshlash   uchun   va   slotFind()   va   slotBrowse()
uyalariga   ulanish   uchun   ikkita   tugma   (pcmdFind   va   pcmdDir   ko'rsatkichlari)
yaratilgan. Konstruktor ikkita yorliq vidjetini yaratadi va bitta satrli matnli maydon
vidjetlari   bilan   bog'lanish   uchun   setBuddy()   usulidan   foydalanadi.   Yaratilgan
vidjetlar QGridLayout klassidan foydalangan holda jadvalga joylashtirilgan.
FileFinder::FileFinder(QWidget* pwgt/*= 0*/) : QWidget(pwgt)
{
m_ptxtDir = new QLineEdit(QDir::current().absolutePath());
m_ptxtMask = new QLineEdit("*.cpp *.h");
m_ptxtResult = new QTextEdit;
QLabel* plblDir = new QLabel("SDirectory");
QLabel* plblMask = new QLabel("SMask");
QPushButton* pcmdDir = new QPushButton(QPixmap(":/fileopen.png"),
QPushButton* pcmdFind = new QPushButton("SFind");
connect(pcmdDir, SIGNAL(clicked()), SLOT(slotBrowse()));
connect(pcmdFind, SIGNAL(clicked()), SLOT(slotFind()));
plblDir->setBuddy(m_ptxtDir);
plblMask->setBuddy(m_ptxtMask);
//Layout setup
QGridLayout* pgrdLayout = new QGridLayout; pgrdLayout->setMargin(5);
pgrdLayout->setSpacing(15);
pgrdLayout->addWidget(plblDir, 0, 0);
pgrdLayout->addWidget(plblMask, 1, 0);
pgrdLayout->addWidget(m_ptxtDir, 0, 1);
pgrdLayout->addWidget(m_ptxtMask, 1, 1);
pgrdLayout->addWidget(pcmdDir, 0, 2);
pgrdLayout->addWidget(pcmdFind, 1, 2);
pgrdLayout->addWidget(m_ptxtResult, 2, 0, 1, 3);
setLayout(pgrdLayout);
}
Quyidagi ro'yxatda qidiruv katalogini tanlash uchun dialog oynasini 
ochadigan slotBrowse() usuli ko'rsatilgan. Ushbu oynani yopgandan so'ng 
tanlangan katalog setText() metodidan foydalanib Katalog matn maydoniga 
yoziladi.
void FileFinder::slotBrowse ( )
{
QString str = QFileDialog: :getExistingDirectory (0,
"Select a Directory",
m_ptxtDir->text ( )
if ( !str.isEmpty ( ) ) {
m_ptxtDir->setText (str) ;
}
SlotFind () usuli qidiruvni yuqoridagi foydalanuvchi tanlagan katalogni start()
usuliga o'tkazish orqali boshlaydi.
void FileFinder::slotFind()
{
start (QDir (m_ptxtDir->text ( ) ) ) ;
} Start () usuli pastki kataloglar orqali qidirish uchun rekursiondan foydalanadi.
Belgilangan   fayllarni   qidirish   jarayoni   uzoq   davom   etishi   mumkin   va   biz   uni
dasturning   asosiy   ipidan   bajarayotganimiz   sababli,   bu   dasturning   grafik
interfeysining   "so'nishiga"   olib   kelishi   mumkin.   Shuning   uchun   ushbu   nomaqbul
ta'sirni   bostirish   uchun   har   safar   usul   chaqirilganda   biz   QApplication   ::
processEvent () usulini chaqiramiz va to'plangan hodisalarni qayta ishlashga imkon
beramiz.   Start   ()   usulida   listFiles   o'zgaruvchisi   joriy   katalogdagi   niqobga   mos
keladigan fayllar ro'yxatini oladi. Buning uchun ikkita parametr usulga o'tkaziladi.
Birinchisi, fayl nomlari va kengaytmalarni qamrab oladigan qidirish naqshlarining
ro'yxati.   Bizning   holatda,   QString   ::   split   ()   ni   chaqirib,   bo'sh   joylar   yordamida
satrni ro'yxatga o'zgartiramiz. Ikkinchi parametr (QDir :: Files bayrog'i) ro'yxatga
faqat   fayllarni   o'z   ichiga   olishi   kerakligini   aytadi.   Olingan   ro'yxat   elementlari
qo'shimchalar   ()   usuli   yordamida   ko'p   qirrali   matn   oynasi   vidjetiga   qo'shiladi.
Qo'shish   davri   tugagach,   QDir   ::   Dirs   bayrog'i   kataloglar   ro'yxatini   olish   uchun
entryList () usuliga o'tkaziladi. Ro'yxatdagi har bir element uchun "tashqari". va "..
start () usuli chaqiriladi.
void FileFinder::start (const QDir& dir)
{
   QApplication: :processEvents ( ) ;
QStringList listFiles=dir.entryList (m_ptxtMask->text () .split (" ") , 
QDir::Files) ;
foreach (QString file, listFiles) {
m_ptxtResult->append (dir.absoluteFilePath (file) ) ;
}
QStringList listDir = dir.entryList (QDir::Dirs) ;
foreach (QString subdir, listDir) {
if (subdir == "." || subdir { continue;}
start (QDir(dir.absoluteFilePath (subdir) ) ) ;
}
} Yuqoridagi ro'yxatdan QDir :: NoDotAndDotDot bayrog'ini ishlatish katalog
nomini satrlar bilan solishtirishdan saqlaydi. " va "..".
KirishList () usulidan parametrlarni ko'rsatmasdan foydalanish mumkin. Bunday 
holda, filtr mezonlari o'zlari setFilter () usuli yordamida o'rnatilishi mumkin. 
Bundan tashqari, ro'yxat bo'yicha tartiblash mezonlarini belgilash uchun siz 
setorting () usulidan foydalanishingiz mumkin. Quyidagi misolda biz hajmi 
bo'yicha saralangan yashirin fayllar ro'yxatini olamiz:
dir.setFilter (QDir::Files I QDir::Hidden) ;
dir.setSorting (QDir::Size);
QStringList content = dir.entryList();
Fayllar va kataloglarni kuzatish
Fayllar   va   kataloglar   nafaqat   sizning   dasturingiz   tomonidan   ishlatilganligi
sababli, ular  o'zgarganda  xabar  berish  juda foydali  bo'lishi  mumkin. Masalan,  siz
fayl   brauzerini   yozdingiz   va   joriy   katalog   tarkibini   ko'rsatasiz.   Ammo
foydalanuvchi   boshqa   dasturlardan   foydalanishi   va   ushbu   faylga   yangi   fayllarni
nusxalashi   mumkin,   shundan   keyin   ko'rsatilgan   ma'lumotlar   endi   haqiqatga   mos
kelmaydi.   Mavjud   katalogdagi   o'zgarishlarni   kuzatish   uchun   maxsus
mexanizmisiz, uning tarkibini yangilash zarurati to'g'risida ma'lumot olmaysiz.
Ushbu mexanizm QFileSystemWatcher klassi tomonidan amalga oshiriladi. Uning
ishlatilishi   addPath   ()   usuli   yordamida   fayl   yoki   katalogga   kerakli   yo'lni   qo'shish
zarurligini anglatadi va ularni kuzatishga ehtiyoj qolmasa, bu yo'lni removePath ()
usuli yordamida olib tashlang. FileChanged () signali fayl o'zgarishi to'g'risida, va
директорat o'zgargan bo'lsa, directoryChanged () signalini yuboradi. Ikkala signal
ham   parametrlar   sifatida   o'zgarishlar   sodir   bo'lgan   yo'ldan   o'tadi.   O'zgartirish
xabarnomalari asinxrondir va asosiy oqimning bajarilishini bloklamaydi.
Aytilganlarni tushuntirish uchun quyidagi dasturni amalga oshiramiz, u buyruqlar 
satrida kataloglar va fayllarni qabul qiladi va o'zgartirilganda ularni namoyish 
qiladi. Birinchidan, biz namoyish qilish uchun sinfni amalga oshiramiz - faqat 
QTextEdit-ni meros qilib olamiz va o'zgartirilgan katalog yo'lini slotDirectory() va 
o'zgartirilgan fayl yo'lini va slotFileChaged () nomini ko'rsatish uchun bo'sh 
joylarni ta'minlaymiz.
Viewer.h fayli
#pragma once
#include <QTextEdit>
class Viewer : public QTextEdit {
Q_OBJECT
public:
Viewer(QWidget* pwgt = 0);
private slots:
void slotDirectoryChanged(const QStrings);
void slotFileChanged (const QStrings);
};
Konstruktorda asosiy dastur oynasiga sarlavha qo'yamiz. SlotDirectoryChanged() 
va slotFileChanged() usullarini chaqirganda biz ma'lumot berish uchun append() 
usulidan foydalanamiz.
Viewer.cpp fayli
#include "Viewer.h"
Viewer::Viewer(QWidget* pwgt /*=0*/) : QTextEdit(pwgt)
{
      setWindowTitle("File System Watcher");
} void Viewer::slotDirectoryChanged(const QStrings str)
{
      append("Directory changed:" + str);
}
void Viewer::slotFileChanged(const QStrings str)
{    append("File changed:" + str);}
Файл  Viewer.cpp
#include "Viewer.h"
Viewer::Viewer(QWidget* pwgt /*=0*/) : QTextEdit(pwgt)
{
      setWindowTitle("File System Watcher");
}
void Viewer::slotDirectoryChanged(const QStrings str)
{
      append("Directory changed:" + str);
}
void Viewer::slotFileChanged(const QStrings str)
{    append("File changed:" + str);}
Quyidagi dasturda biz tomoshabin va tomoshabin vidjetini yaratamiz. Ilova 
ob'ekti (ilova) dan foydalanuvchi tomonidan buyruq satriga o'tgan parametrlar 
ro'yxatini so'raymiz (argumentlar usuli). Biz ro'yxatning eng birinchi elementini 
olib tashlaymiz, chunki bu bizning dasturimizning nomi. Olingan ro'yxat 
kuzatuvchi ob'ektga yuboriladi va buning uchun biz QFileSystemWatcher :: 
addPaths () usulini chaqiramiz.
Kuzatuvchi ob'ekti avtomatik ravishda tahlil qiladi va ro'yxatdan nima katalog 
ekanligini va fayl nima ekanligini bilib oladi. Ushbu tahlil natijasini ko'rish uchun 
biz fayllarni (QFileSystemWatcher::files() metod) va kataloglarni 
(QFileSystemWatcher ::kataloglar() metod) alohida-alohida ko'rsatamiz. 
Keyinchalik, biz kuzatuvchi ob'ektning signallarini 
QFileSystemWatcher::directoryChanged() va  QFileSystemWatcher::fileChanged()-ni slotDirectoryChanged() va 
slotFileChanged() ekran vidjetlarining uyalariga bog'laymiz.
#include <QtWidgets>
#include "Viewer.h"
int main(int argc, char** argv)
{
QApplication app(argc, argv);
QFileSystemWatcher watcher;
Viewer viewer;
QStringList args = app.arguments();
args.removeFirst();
watcher.addPaths(args);
viewer.append("Watching files:" + watcher.files().join(";"));
viewer.append("Watching dirs:" + watcher.directories().join(";"));
viewer.show();
QObject::connect(&watcher, SIGNAL(directoryChanged(const QStrings)),
Sviewer, SLOT(slotDirectoryChanged(const QString&))
);
QObject::connect(Swatcher, SIGNAL(fileChanged(const QStrings)),
Sviewer, SLOT(slotFileChanged(const QStrings))
) ;
return app.exec(); }
3. Fayl va kataloglarni tanlash va tarkibini ko’rsatish jarayonlarini
dasturlash.
Fayllar haqida ma'lumot. QFilelnfo klassi
QFilelnfo sinfining vazifasi faylning xususiyatlari to'g'risida ma'lumot 
berishdir: uning nomi, hajmi, oxirgi o'zgartirish vaqti, kirish huquqi va boshqalar. 
Ushbu sinf ob'ekti faylga yoki QFile klassi ob'ektiga yo'lni konstruktoriga o'tkazish
orqali yaratiladi. Fayl yoki katalog?
Ba'zan   qiziqish   ob'ekti   fayl   emas,   balki   katalog   ekanligiga   ishonch   hosil   qilish
kerak. Buning uchun isFile () va isDir () usullari mavjud. Agar ob'ekt fayl bo'lsa,
isFile   ()   usuli   to'g'ri   qaytadi,   aks   holda   u   noto'g'ri   bo'ladi.   Agar   ob'ekt   katalog
bo'lsa,   unda   isDir   ()   usuli   to'g'ri,   aks   holda   false   qaytaradi.   Ushbu   usullarga
qo'shimcha   ravishda,   QFilelnfo   sinfida   isSymLink   ()   usuli   mavjud   bo'lib,   agar
ob'ekt   ramziy   aloqa   bo'lsa   haqiqiy   qaytaradi   ("ramziy   aloqa"   atamasi   UNIX-da
ishlatiladi, Windows-da bu yorliq deyiladi).
Fayl yo'nalishi va nomi
Faylga mutlaq yo'lni olish uchun siz usuldan foydalanishingiz kerak
absoluteFilePath () -ni tanlang va faylPath () usuli yordamida nisbiy yo'lni oling. 
Fayl nomini olish uchun fayl nomini uning kengaytmasi bilan birga qaytaradigan 
fileNameO usuliga murojaat qiling. Agar faqat fayl nomi kerak bo'lsa, unda 
baseName() usulini chaqirish kerak.
Kengaytmani olish uchun compieteSuffix() usuli qo'llaniladi.
Sana va vaqt haqida ma'lumot
Ba'zan siz fayl yaratilgan vaqtni, uning oxirgi o'zgartirilgan yoki o'qilgan 
vaqtini bilishingiz kerak, buning uchun QFilelnfo sinfi tegishli ravishda yaratilgan 
(), lastModified() va lastRead() usullarini ta'minlaydi. Ushbu usullar toString() 
usuli yordamida satrga aylantirilishi mumkin bo'lgan QDateTime sinf ob'ektlarini 
qaytaradi. Masalan :
// Дата и время создания файла
filelnfo . created (). toString ();
// Дата и время последнего изменения файла
filelnfo . lastModified (). toString ();
// Дата и время последнего чтения файла
filelnfo.lastRead().toString();
Fayl atributlarini olish
Fayl atributlari faylda qanday operatsiyalarni bajarish mumkinligi haqida ma'lumot
beradi. Ularni olish uchun QFilelnfo sinfida quyidagi usullar mavjud: ♦ isReadable() - agar ko'rsatilgan fayldan ma'lumotlarni o'qish mumkin bo'lsa, 
haqiqiy qiymatni qaytaradi;
♦ iswriteable() - agar ko'rsatilgan faylga ma'lumot yozilishi mumkin bo'lsa, haqiqiy
qiymatni qaytaradi;
♦ isHidden() - belgilangan fayl yashirilgan bo'lsa, haqiqiy qiymatni qaytaradi;
♦ isExecutable() - Agar ko'rsatilgan fayl bajarilishi mumkin bo'lsa, haqiqiy 
qiymatni qaytaradi.
UNIX OS-da, bu DOS va Windows-da odatdagidek fayl kengaytmasiga emas, 
balki faylning o'ziga xos xususiyatlariga qarab belgilanadi.
Fayl hajmini aniqlash
QFilelnfo   sinfining   size()   usuli   fayl   hajmini   baytga   qaytaradi.   Fayl   hajmi
baytlarda   kamdan-kam   ko'rsatiladi,   ko'pincha   hajmini   ko'rsatish   uchun   maxsus
harflardan   foydalaniladi.   Masalan,   kilobayt   uchun   K   harfi,   megabayt   uchun   -   M,
gigabayt uchun - G, va terabayt uchun - T. Keyingi funktsiya harf belgilarini hatto
terabayt   oralig'ida   joylashgan   o'lchamlarda   ishlatishga   imkon   beradi   (bir   necha
yillardan keyin bu odatiy hajmga aylanishi mumkin. ba'zi fayl turlari):
QString fileSize(qint64 nSize)
{
int i = 0;
for (; nSize > 1023; nSize /= 1024, ++i) {
if(i >= 4) {
break;     }
}
return QString().setNum(nSize) + "BKMGT"[i];
} QString fileSize(qint64 nSize)
{
int i = 0;
for (; nSize > 1023; nSize /= 1024, ++i) {
if(i >= 4) {
break;     } }
return QString().setNum(nSize) + "BKMGT"[i];
}
Katalog tarkibini ko'rish
QDir   sinfidan   foydalanib,   siz   ko'rsatilgan   katalog   tarkibini   olishingiz
mumkin. Bunday holda, sizni qiziqtirmaydigan fayllarni ro'yxatdan o'chirish uchun
turli xil filtrlarni qo'llashga ruxsat beriladi. Ushbu maqsadlar uchun sinf kirishList
()   va   entryinfoList   ()   usullarini   belgilaydi.   Birinchisi   element   nomlari   ro'yxatini
qaytaradi   (QStringList),   ikkinchisi   ma'lumot   ro'yxatini   (QFileinfoList)   qaytaradi.
Agar   katalogdagi   elementlar   sonini   bilish   kerak   bo'lsa,   faqat   count   ()   usulini
chaqiring.
Quyidagi rasmda ko'rsatilgan dastur Katalog katalogi matn maydonida ko'rsatilgan
katalogdagi fayllarni rekursiv ravishda qidiradi.
Bitmap   tugmachasini   bosish   kerakli   katalogni   tanlash   uchun   dialog   oynasini
ochadi.
Mask   matn   oynasi   ko'rsatilgan   fayllar   uchun   filtrni   o'rnatadi.   Masalan,   C   ++
manbali   fayllarini   ko'rsatish   uchun   Mask   maydonida   *   .ppp   va   *   .H   belgisini
ko'rsatish   kerak.   Topish   tugmachasini   bosgandan   so'ng,   fayllar   belgilangan
parametrlarga   muvofiq   qidiriladi   va   namoyish   etiladi.   Natijalar   ko'p   qatorli   matn
qutisi vidjetida ko'rsatiladi.            Foydalanilgan ea dabiyotlar ro’yxati
1. Sh.A.Nazirov, R.V.Qobulov, M.R.Babajanov «C va C++ TILI»
2. Informatika fanidan o’quv qo’llanma //TATU 489 b. Toshkent, 2012.
3. C / C ++.   Программирование   на   языке   высокого   уровня   /   Т.   А.
Павловская. — СПб.:Питер, 2003. —461 с: ил.
4. Программирование на языке С++ в среде  Qt   Creator :
5. / Е. Р. Алексеев, Г. Г. Злобин, Д. А. Костюк,О. В. Чеснокова,
6. А. С. Чмыхало — М. :  ALT   Linux , 2015. — 448 с.
7. Жасмин   Бланшет,   Марк   Саммерфилд   Qt   4:Программирование   GUI   на
C ++
8. М.Шлее,  Qt  5.10. Профессиональное программирование на С++. - СПб.:
БХВ-Петербург, 2018. - 1072 с.

Mavzu: Fayl va kataloglar bilan ishlash jarayonlarini dasturlash Reja: 1. Qt dasturlash muhitida fayl va kataloglar bilan ishlash. 2. Fayl va kataloglar bilan ishlashda qidiruv,saralash algoritmlari bilan ishlash va dasturlash. 3. Fayl va kataloglarni tanlash va tarkibini ko’rsatish jarayonlarini dasturlash.

1. Qt dasturlash muhitida fayl va kataloglar bilan ishlash. Kataloglar (yoki papkalar, Windows terminologiyasida) va fayllar bilan ishlash barcha operatsion platformalarda mustaqil bo'lmagan sohadir, shuning uchun Qt quyidagi sinflarga asoslanib bunday operatsiyalar uchun o'z yordamini beradi: ♦ QDir - kataloglar bilan ishlash uchun; ♦ QFile - fayllar bilan ishlash uchun; ♦ QFileinfo - fayl haqida ma'lumot olish uchun; ♦ QiODevice - kirish / chiqish uchun mavhum sinf; ♦ QBuffer - fayllarni kompyuter xotirasida aks ettirish uchun. Kirish chiqish. QiODevice sinfi QiODevice sinfi - bu kirish / chiqish qurilmasini ochish va yopish uchun virtual usullarni o'z ichiga olgan, ma'lumot bloklarini yoki individual belgilarni o'qish va yozish uchun kirish / o'chirish moslamasini yaratadigan mavhum sinf. Muayyan qurilmani amalga oshirish meros qolgan sinflarda sodir bo'ladi. Qt QiODevice sinfini meros qilib oladigan to'rtta sinfga ega: ♦ QFile - fayllar bilan operatsiyalarni bajarish uchun sinf; ♦ QBuffer - QByteArray-ga ma'lumot yozishga va o'qishga imkon beradigan bufer sinf; ♦ QAbstractSocket - rozetkalar orqali tarmoq aloqasi uchun tayanch sinf; ♦ QProcess - bu qo'shimcha dalillar bilan jarayonlarni boshlash qobiliyatini ta'minlaydigan va QiODevice-da belgilangan usullar yordamida ushbu jarayonlar bilan aloqa qilish imkonini beradigan sinf. Qurilma bilan ishlash uchun uni QiODevice sinfining sarlavha faylida belgilangan rejimlardan birida ochish kerak: ♦ QiODevice :: NotOpen - qurilma ochiq emas (bu qiymatni ochiq () usuliga o'tkazish mantiqiy emas); ♦ QiODevice :: Readonly - faqat ma'lumotlarni o'qish uchun ochiq qurilma; ♦ QiODevice :: WriteOnly - faqat ma'lumot yozish uchun qurilmani ochish;

♦ QiODevice :: ReadWrite - ma'lumotlarni o'qish va yozish uchun qurilma ochish (Readonly | writeOnly kabi); ♦ QiODevice :: Append - ma'lumotlarni qo'shish uchun ochiq qurilma; ♦ QiODevice: Buferlanmagan - o'qish va yozish oralig'ini chetlab o'tib, ma'lumotlarga to'g'ridan-to'g'ri kirish uchun ochilish; ♦ QiODevice :: Matn - platformaga bog'liq holda satrlarni ajratish belgilarini o'zgartirish uchun ishlatiladi. Windows "\ r \ n", MacOS X va Unix "\ r" dan foydalanadi; ♦ QiODevice :: Kesib oling - barcha ma'lumotlar, agar iloji bo'lsa, ochilish paytida o'chirilishi kerak. Dastur bajarilishining istalgan vaqtida qurilma qaysi rejimda ochilganligini bilish uchun openMode() usulini chaqirish kerak. Siz read() va write() usullari yordamida ma'lumotlarni o'qishingiz va yozishingiz mumkin. Bir vaqtning o'zida barcha ma'lumotlarni o'qish uchun readAll() usuli aniqlanadi, bu ularni QByteArray turidagi ob'ektga qaytaradi.Bir satr yoki belgi mos ravishda readLine () va getChar () usullari bilan o'qilishi mumkin. QiODevice sinfi joriy pozitsiyani o'zgartirish usulini belgilaydi:seek(). Siz joriy pozitsiyani pos o usuliga murojaat qilib olishingiz mumkin. Ammo esda tutingki, ushbu usullar faqat to'g'ridan-to'g'ri ma'lumotlarga kirish uchun qo'llaniladi. Tarmoq ulanishi bo'lgan ketma-ket kirish bilan ular o'zlarining ma'nolarini yo'qotadilar. Bundan tashqari, bu holda qurilma ma'lumotlarini hajmini qaytaradigan size () usuli ham ma'qul emas. Ushbu barcha operatsiyalar faqat QFile, QBuffer va QTemporaryFile sinflariga qo'llaniladi. Qt qo'llab-quvvatlamaydigan o'zingizning kirish/ chiqish qurilmangiz sinfini yaratish uchun siz QiODevice sinfini meros qilib olishingiz va unda readData() va writeData () usullarini qo'llashingiz kerak. Aksariyat hollarda siz open(), close() va atEnd() usullarini bekor qilishingiz kerak bo'lishi mumkin. QiODevice sinfining interfeysi tufayli barcha qurilmalar bilan bir xil tarzda ishlash mumkin va ish paytida, odatda, qurilma fayl, bufer yoki boshqa qurilma

bo'ladimi, farq qilmaydi. Masalan, ushbu usul yordamida har qanday qurilmadan konsolga ma'lumotlarni chiqarish mumkin: void print(QIODevice* pdev) { char ch; QString str; pdev->open(QIODevice::Readonly); for (; !pdev->atEnd();) { pdev->getChar(&ch); str += ch; pdev->close(); qDebug() << str; QIODevice klassi kirish / chiqish qurilmasi to'g'risida ma'lumot olish uchun ishlatilishi mumkin bo'lgan bir qator usullarni taqdim etadi. Masalan, ba'zi qurilmalar faqat ma'lumot yozishi mumkin, boshqalari faqat o'qishi mumkin, boshqalari esa ikkalasini ham bajarishga qodir. Qurilma bilan ishlashda qanday operatsiyalar mavjudligini tekshirish uchun isReadable() va isWriteable () usullaridan foydalaning. Fayllar bilan ishlash. QFile klassi QFile sinfi QIODevice sinfidan meros bo'lib o'tgan. U fayllar bilan ishlash usullarini o'z ichiga oladi: ma'lumotlarni ochish, yopish, o'qish va yozish. Konstruktorda fayl nomini o'z ichiga olgan satrni o'tish orqali ob'ekt yaratishingiz mumkin. Siz konstruktorda hech narsa o'tolmaysiz, lekin uni ob'ektni yaratgandan so'ng, setName() usulini chaqirib bajaring. Misol uchun: QFile file; file.setName("file.dat"); Fayllar bilan ishlash jarayonida ba'zan siz fayl ochiq yoki yo'qligini bilishingiz kerak. Buning uchun QIODevice :: isOpen() usuli chaqiriladi, agar fayl ochiq bo'lsa, u haqiqiy bo'lsa, aks holda noto'g'ri bo'ladi. Faylni yopish uchun close () usuliga murojaat qiling. Yopiq bo'lganda, buferdagi barcha ma'lumotlar yoziladi.

Agar siz bufer ma'lumotlarini faylga yopmasdan yozmoqchi bo'lsangiz, unda QFile::flush() usuli chaqiriladi. Sizga kerak bo'lgan fayl mavjudligini QFile::() statik usuli yordamida tekshirishingiz mumkin. Ushbu usul faylga to'liq yoki nisbiy yo'lni o'z ichiga olgan satrni qabul qiladi. Agar fayl topilsa, usul haqiqiy qaytib keladi, aks holda - noto'g'ri. Ushbu operatsiyani bajarish uchun, shuningdek, statik bo'lmagan QFile::usuli() mavjud, u fileName() usuli bilan qaytarilgan faylning mavjudligini tekshiradi. QIODevice::read() va QIODevice ::write() usullari bloklarga fayllarni o'qish va yozish imkonini beradi. Fayllar bilan ishlashning ba'zi usullarini qo'llashni namoyish etamiz: QFile filel("filel.dat"); QFile file2("file2.dat "); if (file2.exists()) { // Файл уже существует . Перезаписать ? } if (!filel.open(QIODevice::Readonly)) { qDebugO << "Ошибка открытия для чтения"; } if (!file2.open(QIODevice::WriteOnly)) { qDebugO « "Ошибка открытия для записи"; } char а[1024]; while(!filel.atEnd()) { int nBlocksize = filel.read(a, sizeof(a)); file2.write(a, nBlocksize); } filel.close(); file2.close(); Agar siz bir vaqtning o'zida ma'lumotlarni o'qish yoki yozish kerak bo'lsa, unda QIODevice::write() va QIODevice::readAll() usullaridan foydalaning. Barcha