Qfile как открыть файл
Обновлено: 21.11.2024
В этой части руководства по программированию Qt5 C++ мы работаем с файлами и каталогами.
QFile , QDir и QFileInfo — это основные классы для работы с файлами в Qt5. QFile предоставляет интерфейс для чтения и записи файлов. QDir обеспечивает доступ к структурам каталогов и их содержимому. QFileInfo предоставляет независимую от системы информацию о файле, включая имя файла и положение в файловой системе, время доступа и время модификации, разрешения или владельца файла.
Размер файла Qt5
В следующем примере мы определяем размер файла.
Размер файла определяется методом размера QFileInfo.
Имя файла передается программе в качестве аргумента.
Существование файла проверяется с помощью метода exists класса QFile. Если он не существует, мы выдаем предупреждение и завершаем программу.
Создается экземпляр QFileInfo.
Размер файла определяется методом size. qint64 — это тип, гарантированно являющийся 64-разрядным на всех платформах, поддерживаемых Qt.
Результат выводится на консоль.
Чтение файла Qt5
Чтобы прочитать содержимое файла, мы должны сначала открыть файл для чтения. Затем создается входной файловый поток; из этого потока считываются данные.
У нас есть образец текстового файла.
В этом примере данные считываются из файла words.txt.
Создается экземпляр объекта QFile. QFile автоматически закрывает файл, когда он выходит за пределы области видимости.
Метод open QFile открывает файл в режиме только для чтения. Если метод не работает, мы выдаем предупреждение и завершаем программу.
Создается входной поток. QTextStream получает дескриптор файла. Данные будут считаны из этого потока.
В цикле while мы читаем файл построчно до конца файла. Метод atEnd возвращает значение true, если больше нет данных для чтения из потока. Метод readLine считывает одну строку из потока.
Qt5 запись в файл
Для записи в файл мы открываем файл в режиме записи, создаем выходной поток, направленный на файл, и используем оператор записи для записи в этот поток.
В этом примере имена пяти дистрибутивов Linux записываются в файл с именем distrost.txt .
Объект QFile создается с указанным именем файла.
С помощью метода open мы открываем файл только для записи.
Эта строка создает QTextStream, который работает с дескриптором файла. Другими словами, поток записываемых данных направляется в файл.
Данные записываются методом QFile::copy.
Программа принимает два параметра; если они не указаны, заканчивается предупреждающим сообщением.
Из аргументов командной строки программы мы получаем имя исходного файла.
Мы проверяем существование исходного файла с помощью метода exists в QFile. Если он не существует, мы завершаем программу с предупреждающим сообщением.
Мы получаем имя файла назначения.
Исходный файл копируется методом QFile::copy. Первый параметр — это имя исходного файла, второй параметр — это имя файла назначения.
Владелец и группа файла Qt5
У каждого файла есть пользователь, который является его владельцем. Файл также принадлежит группе пользователей для лучшего управления файлами и их защиты.
В этом примере выводится владелец и основная группа данного файла.
Создается экземпляр класса QFileInfo. Его параметром является имя файла, указанное в качестве аргумента командной строки.
Первичная группа файла определяется методом группы QFileInfo.
Владелец файла определяется с помощью метода владельца QFileInfo.
Последнее чтение Qt5, последнее изменение
Файлы хранят информацию о том, когда они последний раз читались или изменялись. Чтобы получить эту информацию, мы используем класс QFileInfo.
В этом примере выводятся данные о последнем прочтении и последнем изменении 6 января 2022 г.
Объект QFileInfo создан.
Метод lastRead возвращает дату и время последнего чтения (доступа) к файлу.
Метод lastModified возвращает дату и время последнего изменения файла.
Qt5 работает с каталогами
У класса QDir есть методы для работы с каталогами.
В примере мы представляем четыре метода работы с каталогами.
Метод mkdir создает каталог. Возвращает true, если каталог был успешно создан.
Exist проверяет наличие каталога. Метод rename переименовывает каталог.
mkpath создает новый каталог и все необходимые родительские каталоги за один раз.
Специальные пути Qt5
В файловой системе есть несколько специальных путей; например домашний каталог или корневой каталог. Класс QDir используется для получения специальных путей в системе.
В примере выводятся четыре специальных пути.
Текущий рабочий каталог извлекается методом QDir::currentPath.
Домашний каталог возвращается методом QDir::homePath.
Временный каталог извлекается с помощью метода QDir::tempPath.
Корневой каталог возвращается методом QDir::rootPath.
Путь к файлу Qt5
Файл идентифицируется по имени и пути; путь состоит из имени файла, базового имени и суффикса.
В этом примере мы используем несколько методов для печати пути к файлу и его частей заданного имени файла.
Путь к файлу определяется с помощью класса QFileInfo.
Метод absoluteFilePath возвращает абсолютный путь, включая имя файла.
Метод baseName возвращает базовое имя — имя файла без пути.
Метод completeBaseName возвращает полное базовое имя — все символы в файле до (но не включая) последнего символа точки.
Метод fileName возвращает имя файла, которое представляет собой базовое имя и расширение.
Метод suffix возвращает окончание файла, состоящее из всех символов в файле после (но не включая) последнего символа точки.
Окончание файла может состоять из нескольких частей; метод completeSuffix возвращает все символы в файле после (но не включая) первого символа точки.
Разрешения файла Qt5
Файлы в файловой системе имеют систему защиты. Файлам присваиваются флаги, которые определяют, кто может получить к ним доступ и изменить их. Метод QFile::permissions возвращает перечисление флагов ИЛИ для рассматриваемого файла.
В этом примере создается список разрешений для данного файла в стиле Unix. Существует три типа возможных пользователей: владелец, группа, к которой принадлежит файл, и остальные пользователи, именуемые другими. Первые три позиции принадлежат владельцу файла, следующие три позиции — группе файла, а последние три символа — остальным. Существует четыре типа прав: чтение (r), запись или изменение (w), выполнение (x) и отсутствие прав (-).
С помощью метода QFile::permissions мы получаем перечисление флагов разрешений.
Эта строка создается динамически на основе заданных разрешений.
Мы используем оператор &, чтобы определить, состоит ли возвращаемое перечисление из флага QFile::ReadOwner.
Владелец и группа пользователей, которым принадлежит файл, имеют право читать файл и изменять его. Другие пользователи имеют право на чтение файла. Поскольку файл не является исполняемым, права на его выполнение отсутствуют.
Содержимое каталога списка Qt5
В следующем примере мы отображаем содержимое данного каталога.
Чтобы получить список содержимого каталога, мы используем класс QDir и его метод entryInfoList. Список файлов обратно отсортирован по размеру и аккуратно выстроен. Есть две колонки; первый столбец содержит имена файлов, а второй столбец — размеры файлов.
Создается объект QDir с заданным именем каталога.
Метод setFilter указывает тип файлов, которые должны быть возвращены методом entryInfoList.
Метод setSorting указывает порядок сортировки, используемый методом entryInfoList.
Метод entryInfoList возвращает список объектов QFileInfo для всех файлов и каталогов в каталоге, отфильтрованных и упорядоченных методами фильтрации и упорядочения. QFileInfoList является синонимом QList .
Проходим по списку и определяем максимальный размер имени файла. Эта информация необходима для аккуратной организации вывода.
Мы добавляем два дополнительных пробела к длине столбца.
Здесь мы печатаем имена столбцов. Метод leftJustified возвращает строку заданного размера, выровненную по левому краю и дополненную символом заполнения (по умолчанию пробелом) справа от нее.
Проходим по списку файлов и печатаем их имена и размеры. Первый столбец выравнивается по левому краю и при необходимости дополняется пробелами; ко второму столбцу просто добавляется конец строки.
У меня есть программа, которую я украл с веб-сайта Qt, чтобы попытаться открыть файл. Программа отказывается открывать что-либо, я не понимаю, почему. Я просмотрел много документации, но ничего не нашел, не могли бы вы объяснить, почему это не работает.
Он чрезвычайно прост в использовании. Самый простой способ — сохранить возвращаемое значение QFile::error() в переменную, затем запустить код в отладчике и посмотреть, что это за возвращаемое значение. Затем найдите в документации Qt, что означает этот код ошибки.
А вы действительно уверены, что файл C:\n.txt существует? Вы уверены, что это не, например, C:\n.txt.txt?
спасибо вам soosososososогромное, у меня было так много приступов паники из-за этого, я так переживаю, оказывается, это был n.txt.txt, я такой тупой, спасибо
2 ответа 2
Перед открытием файла всегда можно проверить наличие:
Если файл существует, но не открывается, вы можете получить состояние ошибки и сообщение:
И всегда: если файл был открытым, то не забудьте его закрыть. В вашем примере вы этого не сделали:
FileError QFile::error () const Возвращает статус ошибки файла. Состояние устройства ввода-вывода возвращает код ошибки. Например, если open() возвращает false или операция чтения/записи возвращает -1, эту функцию можно вызвать, чтобы выяснить причину сбоя операции. См. также unsetError().
Опубликуйте код ошибки. Разве это не должен быть файл QFile("C:\n.txt"); \ нет / в окнах?
Тогда это должен быть файл QFile("C:\\n.txt"); потому что обратную косую черту нужно экранировать. Но / отлично работает в Windows, поэтому его не нужно менять.
Действительно, если поддерживается, использование / является определенно предпочтительным разделителем пути в строках внутри приложения. Нет причин усложнять перенос и нет причин использовать char, который требует экранирования внутри строк (с возможностью забыть, а в случае неудачи просто молча получить неправильный char).
Примечание. Все функции этого класса являются реентерабельными.
Общедоступные типы
Общие функции
QFile(const QString &name, QObject *parent) | |
QFile( QObject *parent) | |
QFile(const QString &name) | |
QFile() | |
виртуальный | ~QFile() |
bool | copy(const QString &newName) |
bool | exists() const | tr>
bool | link(const QString &linkName) |
bool | < td >moveToTrash()|
bool | open(FILE *fh, QIODevice::OpenMode mode i>, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) |
bool | open(int fd, QIODevice::OpenMode режим, QFileDevice::FileHandleFlags handleFlags = DontCloseHandle) |
bool | < td >remove()|
bool | rename(const QString &newName) | void | setFileName(const QString &имя) |
QString | symLinkTarget() const |
Повторно реализованы общедоступные функции
virtual QString | fileName() const override | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
virtual bool | open(QIODevice: :OpenMode режим) переопределить | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
виртуальный QFileDevice::Permissions | permissions() const переопределить | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
virtual bool | resize(qint64 sz) override | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
virtual bool | < td >setPermissions(QFileDevice::Permissions permissions) override||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
virtual qint64 | size() const override |
bool | copy(const QString &fileName, const QString &newName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
QString | decodeName(const QByteArray &localFileName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
QString | decodeName(const char *localFileName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
QByteArray | encodeName(const QString &fileName ) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bool | exists(const QString &fileName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bool | link(const QString &fileName, const QString &linkName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bool | moveToTrash(const QString &fileName, QString *pathInTrash = nullptr) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
QFileDevice: :Permissions | permissions(const QString &fileName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bool | remove(const QString & fileName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bool | rename(const QString &oldName, const QString &newName) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bool | resize(const QString &fileName i>, qint64 sz) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
bool | setPermissions(const QString &fileName, QFileDevice ::Разрешения разрешения) | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
QString | symLinkTarget(const QString &fileName) тд>тр> таблица>
Подробное описаниеQFile — это устройство ввода-вывода для чтения и записи текстовых и двоичных файлов и ресурсов. QFile может использоваться сам по себе или, что более удобно, с QTextStream или QDataStream. Имя файла обычно передается в конструкторе, но его можно задать в любое время с помощью setFileName(). QFile ожидает, что разделителем файлов будет '/' независимо от операционной системы. Использование других разделителей (например, '\') не поддерживается. Вы можете проверить существование файла с помощью exists() и удалить файл с помощью remove(). (Более сложные операции, связанные с файловой системой, обеспечивают QFileInfo и QDir.) Файл открывается с помощью open(), закрывается с помощью close() и очищается с помощью flush().Данные обычно считываются и записываются с использованием QDataStream или QTextStream, но вы также можете вызывать унаследованные от QIODevice функции read(), readLine(), readAll(), write(). QFile также наследует методы getChar(), putChar() и ungetChar(), которые работают с одним символом за раз. Размер файла возвращается функцией size(). Вы можете получить текущую позицию в файле с помощью pos() или перейти к новой позиции в файле с помощью seek(). Если вы достигли конца файла, atEnd() возвращает true . Чтение файлов напрямуюВ следующем примере текстовый файл считывается построчно: Флаг QIODevice::Text, переданный в open(), указывает Qt преобразовать разделители строк в стиле Windows ("\r\n") в символы конца строки в стиле C++ ("\n"). По умолчанию QFile предполагает двоичный формат, т. е. не выполняет никакого преобразования байтов, хранящихся в файле. Использование потоков для чтения файловВ следующем примере QTextStream используется для чтения текстового файла построчно: Чтобы написать текст, мы можем использовать оператор >(), чтобы прочитать его обратно. Подробнее см. в документации по классу. В Unix существуют специальные системные файлы (например, в /proc ), для которых функция size() всегда возвращает 0, однако вы все же можете прочитать больше данных из такого файла; данные генерируются в прямом ответе на ваш вызов read(). Однако в этом случае вы не можете использовать atEnd(), чтобы определить, есть ли еще данные для чтения (поскольку atEnd() вернет true для файла, размер которого, как утверждается, равен 0). Вместо этого вы должны либо вызывать readAll(), либо вызывать read() или readLine() несколько раз, пока не перестанут считываться данные. В следующем примере QTextStream используется для чтения /proc/modules построчно: СигналыВ отличие от других реализаций QIODevice, таких как QTcpSocket, QFile не выдает сигналы aboutToClose(), bytesWritten() или readyRead(). Эта деталь реализации означает, что QFile не подходит для чтения и записи файлов определенных типов, таких как файлы устройств на платформах Unix. Проблемы, связанные с платформойРазрешения на доступ к файлам обрабатываются по-разному в Unix-подобных системах и Windows. В недоступном для записи каталоге в Unix-подобных системах файлы не могут быть созданы. Это не всегда так в Windows, где, например, каталог «Мои документы» обычно недоступен для записи, но в нем все же можно создавать файлы. Понимание Qt прав доступа к файлам ограничено, что особенно влияет на функцию QFile::setPermissions(). В Windows Qt установит только устаревший флаг только для чтения и только в том случае, если не передан ни один из флагов Write*. Qt не манипулирует списками управления доступом (ACL), что делает эту функцию практически бесполезной для томов NTFS. Это все еще может быть полезно для USB-накопителей, использующих файловые системы VFAT. Списки управления доступом POSIX также не изменяются. Документация по типу участникаtypedef QFile:: DecoderFnПримечание. Все функции в этом классе являются реентерабельными, за исключением setEncodingFunction() и setDecodingFunction(), которые не являются реентерабельными. Общедоступные типы
Общие функции
Повторно реализованы общедоступные функцииСтатические общедоступные членыПовторно реализованы защищенные функции
Дополнительные унаследованные члены
Подробное описаниеКласс QFile предоставляет интерфейс для чтения и записи файлов. QFile — это устройство ввода-вывода для чтения и записи текстовых и двоичных файлов и ресурсов. QFile может использоваться сам по себе или, что более удобно, с QTextStream или QDataStream. Имя файла обычно передается в конструкторе, но его можно задать в любое время с помощью setFileName(). QFile ожидает, что разделителем файлов будет '/' независимо от операционной системы. Использование других разделителей (например, '\') не поддерживается. Вы можете проверить существование файла с помощью exists() и удалить файл с помощью remove(). (Более сложные операции, связанные с файловой системой, обеспечивают QFileInfo и QDir.) Файл открывается с помощью open(), закрывается с помощью close() и очищается с помощью flush(). Данные обычно считываются и записываются с использованием QDataStream или QTextStream, но вы также можете вызывать унаследованные от QIODevice функции read(), readLine(), readAll(), write(). QFile также наследует методы getChar(), putChar() и ungetChar(), которые работают с одним символом за раз. Размер файла возвращается функцией size(). Вы можете получить текущую позицию в файле с помощью pos() или перейти к новой позиции в файле с помощью seek(). Если вы достигли конца файла, atEnd() возвращает значение true. Чтение файлов напрямуюВ следующем примере текстовый файл считывается построчно: Флаг QIODevice::Text, переданный в open(), указывает Qt преобразовать разделители строк в стиле Windows ("\r\n") в символы конца строки в стиле C++ ("\n"). По умолчанию QFile предполагает двоичный формат, т. е. не выполняет никакого преобразования байтов, хранящихся в файле. Использование потоков для чтения файловВ следующем примере QTextStream используется для чтения текстового файла построчно: Чтобы написать текст, мы можем использовать оператор >(), чтобы прочитать его обратно. Подробнее см. в документации по классу. В Unix есть некоторые специальные системные файлы (например, в /proc), для которых функция size() всегда возвращает 0, однако вы все же можете прочитать больше данных из такого файла; данные генерируются в прямом ответе на ваш вызов read(). Однако в этом случае вы не можете использовать atEnd(), чтобы определить, есть ли еще данные для чтения (поскольку atEnd() вернет true для файла, размер которого, как утверждается, равен 0). Вместо этого вы должны либо вызывать readAll(), либо вызывать read() или readLine() несколько раз, пока не перестанут считываться данные. В следующем примере QTextStream используется для чтения /proc/modules построчно: СигналыВ отличие от других реализаций QIODevice, таких как QTcpSocket, QFile не выдает сигналы aboutToClose(), bytesWritten() или readyRead(). Эта деталь реализации означает, что QFile не подходит для чтения и записи файлов определенных типов, таких как файлы устройств на платформах Unix. Проблемы, связанные с платформойРазрешения на доступ к файлам обрабатываются по-разному в Linux/Mac OS X и Windows. В недоступном для записи каталоге в Linux файлы не могут быть созданы. Это не всегда так в Windows, где, например, каталог «Мои документы» обычно недоступен для записи, но в нем все же можно создавать файлы. Документация по типу участникаtypedef QFile:: DecoderFntypedef QFile:: EncoderFnперечисление QFile:: FileErrorЭто перечисление описывает ошибки, которые могут быть возвращены функцией error().
enum QFile:: FileHandleFlag
|
Константа | Значение | Описание |
---|---|---|
QFile::AutoCloseHandle | 0x0001 | Описатель файла, переданный в open(), должен быть закрыт функцией close(), поведение по умолчанию заключается в том, что close просто очищает файл, а приложение отвечает за закрытие дескриптора файла. При открытии файла по имени этот флаг игнорируется, поскольку Qt всегда «владеет» дескриптором файла и должен закрыть его. |
QFile::DontCloseHandle | 0 | Описатель файла, переданный в open(), не будет закрыт Qt. Приложение должно обеспечить вызов функции close(). |
Это перечисление было введено или изменено в Qt 4.8.
Тип FileHandleFlags является определением типа для QFlags. Он хранит комбинацию значений FileHandleFlag по схеме ИЛИ.
перечисление QFile:: MemoryMapFlags
Это перечисление описывает специальные параметры, которые могут использоваться функцией map().
Константа | Значение | Описание |
---|---|---|
QFile::NoOptions | 0 | Нет параметров. |
Это перечисление было введено или изменено в Qt 4.4.
enum QFile:: Разрешения
flags QFile:: Разрешения
Это перечисление используется функцией разрешения() для сообщения разрешений и владельца файла. Значения могут быть объединены по ИЛИ для проверки нескольких разрешений и значений прав собственности.
Константа | Значение | Описание |
---|---|---|
QFile::ReadOwner | 0x4000 | Файл доступен для чтения владельцу файла. |
QFile::WriteOwner | 0x2000 | Ваш файл доступен для записи владельцу файла. |
QFile::ExeOwner | 0x1000 | Файл исполняемый владельцем файла. |
QFile::ReadUser | 0x0400 td> | Файл доступен для чтения пользователем. |
QFile::WriteUser | 0x0200< /tt> | Файл доступен для записи пользователю. |
QFile::ExeUser | 0x0100 | Файл исполняемый пользователем. |
QFile::ReadGroup | 0x0040 | < td >Файл доступен для чтения группой.|
QFile::WriteGroup | 0x0020 | Группа может записывать файл. |
QFile::ExeGroup | 0x0010 | Файл может исполняться группой. |
QFile::ReadOther | < td >0x0004Файл доступен для чтения всем. | |
QFile::WriteOther< /td> | 0x0002 | Файл доступен для записи всем. |
QFile::ExeOther< /tt> | 0x0001 | Файл может исполняться кем угодно. |
Предупреждение: Из-за различий в платформах, поддерживаемых Qt, семантика ReadUser, WriteUser и ExeUser зависит от платформы: в Unix возвращаются права владельца файла, а в Windows — права текущего пользователя. возвращаются. Это поведение может измениться в будущей версии Qt.
Обратите внимание, что Qt по умолчанию не проверяет разрешения для файловых систем NTFS, так как это может значительно снизить производительность обработки файлов. Можно принудительно проверить разрешения в NTFS, включив в исходный код следующий код:
Затем проверка разрешений включается и выключается путем увеличения и уменьшения qt_ntfs_permission_lookup на 1.
Читайте также:
- Как узнать, почему компьютер выключился
- Как закрыть открытые приложения на планшете lenovo
- Определить объем видеопамяти компьютера, необходимый для реализации графического режима
- Как включить звук на винк ростелеком на тв
- Почему вас просят включить ноутбук в аэропорту?