Приглашение открыть файл только для чтения
Если вы не хотите, чтобы рецензенты случайно изменили ваш документ, вы можете перед отправкой на рецензирование сделать его доступным только для чтения. Еще один способ — ограничить форматирование и редактирование.
Если вы сделаете файл документа доступным только для чтения, его можно будет читать и копировать, но нельзя будет изменять. Если один из рецензентов попытается внести изменения в файл, доступный только для чтения, для сохранения изменений ему придется присвоить документу новое имя или сохранить его в другом месте.
Примечание: Если вы сделаете документ доступным только для чтения, это не помешает другим лицам создавать его копии и сохранять их в другом месте с другим именем.
Ограничение редактирования
Вы можете ограничить редактирование документа, чтобы он открывся в режиме только для просмотра.
- На вкладке Файл выберите пункт Сведения.
- Выберите Защитить документ.

Изменение режима просмотра
Вы можете переключиться только с просмотра на другие режимы, предоставленные владельцем документа (редактирование, рецензирование).
- Перейдите на вкладку Просмотр , чтобы открыть параметры.
- Выберите Редактирование или Рецензирование.
Примечание: Единственными параметрами, которые можно выбрать, являются те, которые предоставил владелец документа.

Ограничение редактирования
- На вкладке Рецензирование нажмите кнопку Ограничить редактирование.

- В области Ограничения на редактирование установите флажок Разрешить только указанный способ редактирования документа и убедитесь, что в списке выбран пункт Только чтение.

- Нажмите кнопку Да, включить защиту.

- В появившемся окне введите пароль, который сможете запомнить, и его подтверждение. Пароль необязательный. Но если вы не добавите пароль, любой пользователь может нажать кнопку Остановить защиту и изменить документ.
Задайте значение «Всегда открывать как только для чтения»
1. Выберите Файл > сведения > Защитить документ.

2. Выберите Всегда открывать только для чтения.

Открытие документа, к которым предоставлен общий доступ только для чтения
При открытии документа, к которому предоставлен общий доступ только для чтения, у вас есть два варианта.
Открытие документа только для чтения
Открытие файла для чтения или записи
Функция CreateFile может создать новый файл или открыть существующий. Необходимо указать имя файла, инструкции по созданию и другие атрибуты. Когда приложение создает новый файл, операционная система добавляет его в указанный каталог.
Пример. Открытие файла для записи
В следующем примере используется CreateFile для создания нового файла и его открытия для записи и WriteFile для синхронной записи в файл простой строки.
Последующий вызов для открытия этого файла с помощью CreateFile будет завершаться ошибкой, пока дескриптор не будет закрыт.
#include #include #include #include void DisplayError(LPTSTR lpszFunction); int __cdecl _tmain(int argc, TCHAR *argv[]) < HANDLE hFile; char DataBuffer[] = "This is some test data to write to the file."; DWORD dwBytesToWrite = (DWORD)strlen(DataBuffer); DWORD dwBytesWritten = 0; BOOL bErrorFlag = FALSE; printf("\n"); if( argc != 2 ) < printf("Usage Error:\tIncorrect number of arguments\n\n"); _tprintf(TEXT("%s \n"), argv[0]); return; > hFile = CreateFile(argv[1], // name of the write GENERIC_WRITE, // open for writing 0, // do not share NULL, // default security CREATE_NEW, // create new file only FILE_ATTRIBUTE_NORMAL, // normal file NULL); // no attr. template if (hFile == INVALID_HANDLE_VALUE) < DisplayError(TEXT("CreateFile")); _tprintf(TEXT("Terminal failure: Unable to open file \"%s\" for write.\n"), argv[1]); return; >_tprintf(TEXT("Writing %d bytes to %s.\n"), dwBytesToWrite, argv[1]); bErrorFlag = WriteFile( hFile, // open file handle DataBuffer, // start of data to write dwBytesToWrite, // number of bytes to write &dwBytesWritten, // number of bytes that were written NULL); // no overlapped structure if (FALSE == bErrorFlag) < DisplayError(TEXT("WriteFile")); printf("Terminal failure: Unable to write to file.\n"); >else < if (dwBytesWritten != dwBytesToWrite) < // This is an error because a synchronous write that results in // success (WriteFile returns TRUE) should write all data as // requested. This would not necessarily be the case for // asynchronous writes. printf("Error: dwBytesWritten != dwBytesToWrite\n"); >else < _tprintf(TEXT("Wrote %d bytes to %s successfully.\n"), dwBytesWritten, argv[1]); >> CloseHandle(hFile); > void DisplayError(LPTSTR lpszFunction) // Routine Description: // Retrieve and output the system error message for the last-error code < LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); lpDisplayBuf = (LPVOID)LocalAlloc( LMEM_ZEROINIT, ( lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) // account for format string * sizeof(TCHAR) ); if (FAILED( StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error code %d as follows:\n%s"), lpszFunction, dw, lpMsgBuf))) < printf("FATAL ERROR: Unable to output error code.\n"); >_tprintf(TEXT("ERROR: %s\n"), (LPCTSTR)lpDisplayBuf); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf);
Пример. Открытие файла для чтения
В следующем примере используется CreateFile , чтобы открыть существующий файл для чтения, и ReadFile для синхронного чтения до 80 символов из файла.
В этом случае CreateFile завершается успешно, только если указанный файл уже существует в текущем каталоге. Последующий вызов для открытия этого файла с помощью CreateFile будет выполнен успешно, если вызов использует один и тот же режим доступа и общего доступа.
Совет. Для тестирования этого примера можно использовать файл, созданный с помощью предыдущего примера WriteFile.
#include #include #include #include #define BUFFERSIZE 5 DWORD g_BytesTransferred = 0; void DisplayError(LPTSTR lpszFunction); VOID CALLBACK FileIOCompletionRoutine( __in DWORD dwErrorCode, __in DWORD dwNumberOfBytesTransfered, __in LPOVERLAPPED lpOverlapped ); VOID CALLBACK FileIOCompletionRoutine( __in DWORD dwErrorCode, __in DWORD dwNumberOfBytesTransfered, __in LPOVERLAPPED lpOverlapped ) < _tprintf(TEXT("Error code:\t%x\n"), dwErrorCode); _tprintf(TEXT("Number of bytes:\t%x\n"), dwNumberOfBytesTransfered); g_BytesTransferred = dwNumberOfBytesTransfered; >// // Note: this simplified sample assumes the file to read is an ANSI text file // only for the purposes of output to the screen. CreateFile and ReadFile // do not use parameters to differentiate between text and binary file types. // int __cdecl _tmain(int argc, TCHAR *argv[]) < HANDLE hFile; DWORD dwBytesRead = 0; char ReadBuffer[BUFFERSIZE] = ; OVERLAPPED ol = ; printf("\n"); if( argc != 2 ) < printf("Usage Error: Incorrect number of arguments\n\n"); _tprintf(TEXT("Usage:\n\t%s \n"), argv[0]); return; > hFile = CreateFile(argv[1], // file to open GENERIC_READ, // open for reading FILE_SHARE_READ, // share for reading NULL, // default security OPEN_EXISTING, // existing file only FILE_ATTRIBUTE_NORMAL | FILE_FLAG_OVERLAPPED, // normal file NULL); // no attr. template if (hFile == INVALID_HANDLE_VALUE) < DisplayError(TEXT("CreateFile")); _tprintf(TEXT("Terminal failure: unable to open file \"%s\" for read.\n"), argv[1]); return; >// Read one character less than the buffer size to save room for // the terminating NULL character. if( FALSE == ReadFileEx(hFile, ReadBuffer, BUFFERSIZE-1, &ol, FileIOCompletionRoutine) ) < DisplayError(TEXT("ReadFile")); printf("Terminal failure: Unable to read from file.\n GetLastError=%08x\n", GetLastError()); CloseHandle(hFile); return; >SleepEx(5000, TRUE); dwBytesRead = g_BytesTransferred; // This is the section of code that assumes the file is ANSI text. // Modify this block for other data types if needed. if (dwBytesRead > 0 && dwBytesRead else if (dwBytesRead == 0) < _tprintf(TEXT("No data read from file %s\n"), argv[1]); >else < printf("\n ** Unexpected value for dwBytesRead ** \n"); >// It is always good practice to close the open file handles even though // the app will exit here and clean up open handles anyway. CloseHandle(hFile); > void DisplayError(LPTSTR lpszFunction) // Routine Description: // Retrieve and output the system error message for the last-error code < LPVOID lpMsgBuf; LPVOID lpDisplayBuf; DWORD dw = GetLastError(); FormatMessage( FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, dw, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf, 0, NULL ); lpDisplayBuf = (LPVOID)LocalAlloc( LMEM_ZEROINIT, ( lstrlen((LPCTSTR)lpMsgBuf) + lstrlen((LPCTSTR)lpszFunction) + 40) // account for format string * sizeof(TCHAR) ); if (FAILED( StringCchPrintf((LPTSTR)lpDisplayBuf, LocalSize(lpDisplayBuf) / sizeof(TCHAR), TEXT("%s failed with error code %d as follows:\n%s"), lpszFunction, dw, lpMsgBuf))) < printf("FATAL ERROR: Unable to output error code.\n"); >_tprintf(TEXT("ERROR: %s\n"), (LPCTSTR)lpDisplayBuf); LocalFree(lpMsgBuf); LocalFree(lpDisplayBuf); >
Как открыть сохраненный документ только для чтения?
- Начните открытие документа любым известным способом.
- Отыщите нужный файл на компьютере и выделите его одним щелчком левой кнопки мыши.
- В окне «Открытие документа» раскройте меню кнопки «Открыть» (рис. 2.23).

Рис. 2.23. Окно «Открытие документа». Меню кнопки «Открыть»
[stextbox caption=»Примечание»]В документ можно вносить исправления и дополнения, но их нельзя будет сохранить в этом же документе. При попытке сохранения автоматически откроется окно с предложением задать другое имя или новое место сохранения документа.[/stextbox]
Чтение файлов — Основы командной строки
Ранее в курсе мы обсудили общее устройство файловой системы в POSIX-совместимых операционных системах.
Пора приступать к взаимодействию с файлами. В этом уроке рассмотрим различные способы чтения текстовых файлов.
Команда cat
Самый простой способ прочитать файл — команда cat :
cat NAME cat -- concatenate and print files SYNOPSIS cat [-benstuv] [file . ] .
Команда cat ожидает аргументы — пути до файлов, которые надо читать. В простейшем случае достаточно передать один путь. Это удобно, когда надо посмотреть содержимое небольшого файла:
cat .bash_logout # ~/.bash_logout: executed by bash(1) when login shell exits. # when leaving the console clear the screen to increase privacy if [ "$SHLVL" = 1 ]; then [ -x /usr/bin/clear_console ] && /usr/bin/clear_console -q fi
Команды head и tail
Иногда нужно посмотреть только начало файла или его конец, в такой ситуации помогают команды head и tail . Они тоже принимают на вход путь до файла, только head показывает первые 10 строк, а tail — последние 10 строк файла.
Это поведение можно менять, задавая желаемое количество строк через опцию -n :
Посмотрим, как работает head :
head -n 2 .bashrc # ~/.bashrc: executed by bash(1) for non-login shells. # see /usr/share/doc/bash/examples/startup-files (in the package bash-doc)
Похожим образом работает tail :
tail -n 2 .bashrc fi fi
Некоторые файлы наполняются очень интенсивно. Например, быстро наполняются логи — это текстовые файлы, в которые заносится информация о происходящих процессах в определенной системе.
В Linux логи лежат в каталоге /var/log . Туда пишет и сам Linux, и большая часть установленных программ. Основной файл логов Linux называется syslog .
Туда попадает ключевая информация о происходящих процессах в операционной системе и возникающих ошибках.
В WSL syslog не включен по умолчанию. Чтобы включить его, сперва установите его как:
sudo add-apt-repository ppa:adiscon/v8-stable sudo apt-get install rsyslog
А затем запустите, используя команду sudo service rsyslog start .
Представим, что нам нужно изучить события, которые происходят часто. Знакомые команды в этой ситуации не помогут:
- Пользоваться командой cat неудобно, потому что syslog слишком большой
- Команда tail тоже не подойдет, потому что при высокой скорости записи логов мы рискуем пропустить часть события
В этой ситуации поможет tail , запущенный в особом режиме — с флагом -f .
Команда tail -f path/to/file не просто выводит последние строчки файла, но и ждет появления новых. Как только файл дописывается, tail сразу выводит на экран добавленные строки.
Среди наших примеров это первая команда, которая захватывает управление. Другими словами, после запуска она не заканчивает выполнение сразу, а продолжает работать, ожидая новые данные в файле, который выводится:
# Если у вас не хватает прав, чтобы смотреть файл syslog, наберите sudo перед командой tail, как показано ниже # Есть вероятность, что sudo попросит вас ввести пароль # Сделайте это и нажмите Enter # При наборе пароля курсор не будет двигаться # Это сделано для безопасности sudo tail -f syslog Aug 28 18:00:01 ip-10-0-1-223 systemd-udevd[15400]: Could not generate persistent MAC address for veth5c6ed9c: No such file or directory Aug 28 18:00:01 ip-10-0-1-223 kernel: [126412.013499] device veth6969122 entered promiscuous mode Aug 28 18:00:01 ip-10-0-1-223 systemd[1]: Starting Update resolvconf for networkd DNS. Aug 28 18:00:01 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection. Aug 28 18:00:01 ip-10-0-1-223 systemd-timesyncd[522]: Synchronized to time server 91.173.73.198:123 (ntp.ubuntu.com). Aug 28 18:00:01 ip-10-0-1-223 sh[15415]: sed: cant read /run/systemd/netif/leases/*: No such file or directory Aug 28 18:00:01 ip-10-0-1-223 kernel: [126412.086162] IPv6: ADDRCONF(NETDEV_UP): veth6969122: link is not ready Aug 28 18:00:01 ip-10-0-1-223 systemd-udevd[15403]: Could not generate persistent MAC address for veth6969122: No such file or directory Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection. Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Synchronized to time server 91.173.73.198:123 (ntp.ubuntu.com). Aug 28 18:00:02 ip-10-0-1-223 systemd-timesyncd[522]: Network configuration changed, trying to establish connection.
Для остановки выполнения этой команды нажмите Ctrl + C .
Пейджеры
Особая категория программ для просмотра содержимого файла — пейджеры. Пейджер похож на текстовый редактор, открытый только в режиме чтения. Самый распространенный пейджер называется less . Попробуем открыть с помощью него файл syslog :
# Снова придется воспользоваться sudo sudo less syslog # Здесь много вывода
Пейджер less открывает файл и остается в этом режиме. Он позволяет производить поиск и перемещаться по файлу вперед и назад.
Одна из отличительных особенностей пейджеров состоит в том, что они одинаково хорошо работают с файлами любых размеров. Все потому, что пейджер не пытается загрузить в память весь файл до его отображения. Он грузит только ту часть, которая помещается на экран и при перемещении подгружает остальное.
В целом, пейджер less предоставляет несколько десятков команд для перемещения по тексту и его поиску, про большинство из них можно прочитать в соответствующем мануале. Здесь затронем основные:
- Выход — q
- Вперед на страницу — f
- Назад на страницу — b
- Поиск введенного текста — вводим / , печатаем текст и нажимаем Enter
- Переход к следующему совпадению — n
- Переход к предыдущему совпадению — N
Поведение пейджеров похоже на то, что мы наблюдали в мануалах. Дело в том, что когда мы запускали man , то перед нами открывался less с загруженным туда контентом. Как вы увидите позже, пейджеры невероятно популярны и неявно запускаются другими программами.
![]()
Остались вопросы? Задайте их в разделе «Обсуждение»
Вам ответят команда поддержки Хекслета или другие студенты