Где находится буфер обмена и что это такое…

Где находится буфер обмена и что это такое…

  • Перевод

В этой статье я хочу рассказать о том, как реализован слой «буферизации вывода» в PHP, как работает и как с ним взаимодействовать из PHP. В этом слое нет ничего сложного, но многие разработчики либо совсем не понимают, как с ним обращаться, либо не имеют полной ясности. Всё, о чём я буду писать, относится к PHP версии 5.4 и выше. Именно начиная с неё изменились многие вещи, связанные с буфером вывода (БВ). По сути, этот функционал был полностью переписан, поэтому совместимость с версией 5.3 сохранилась лишь частично.

Что такое буфер вывода?

Поток вывода в PHP содержит байты, обычно в виде текста, которые разработчику надо вывести на экран. Чаще всего для этого используется конструкция echo или printf() . Во-первых, нужно понимать, что любая функция, которая что-то выводит, будет использовать БВ из области PHP. Если говорить о расширениях для PHP, то можно получить доступ к функциям, пишущим в SAPI напрямую, в обход любого вышерасположенного БВ. API C задокументировано в lxr.php.net/xref/PHP_5_5/main/php_output.h , отсюда можно почерпнуть немало информации, например, о размере буфера по умолчанию.

Второй важный момент: слой БВ является не единственным слоем, в котором буферизуются выводимые данные.

И третье: в зависимости от SAPI, который вы используете (веб или cli), слой БВ может вести себя по-разному.

Ниже представлена схема, которая поможет понять всё вышесказанное:

Здесь мы видим, что для управления выводимыми данными в PHP используется три логических слоя буферизации. Два из них принадлежат тому самому «буферу вывода», а третий - SAPI. Когда поток вывода покидает область PHP, чтобы попасть на нижний уровень архитектуры, «по пути» могут возникнуть новые буферы: буфер терминала, буфер FastCGI, буфер веб-сервера, буфер операционной системы, буферы стеков TCP/IP. Не забывайте об этом. Хотя в рамках данной статьи мы будем говорить только о PHP, в стеке на пути данных к нижнему слою и пользователю встретится ещё немало программных средств.

Важное замечание относительно CLI SAPI: он отключает в PHP любой буфер вывода по умолчанию, присвоив в ini параметру output_buffering значение 0. Так что, пока вы в CLI не пропишете вручную функции ob_() , по умолчанию все выводимые данные будут напрямую попадать в слой SAPI. Более того, в CLI для параметра implicit_flush жёстко указано значение 1. Суть этого параметра разработчики вечно понимают неправильно, хотя код говорит совершенно недвусмысленно: когда implicit_flush имеет значение 1, буфер слоя SAPI сбрасывается при каждой записи. То есть каждый раз, когда вы записываете данные для вывода с помощью CLI SAPI, они немедленно отправляются на нижний уровень, где записываются в виде stdout, а потом сбрасываются.

Стандартный PHP-слой буферизации вывода

Если вы используете SAPI не так, как CLI, а например, PHP-FPM, то можете поэкспериментировать с тремя параметрами в ini, имеющими отношение к буферу:
  • output_buffering
  • implicit_flush
  • output_handler
Обратите внимание, что использование с ними ini_set() не даст никакого эффекта, поскольку их значения считываются в момент запуска PHP, до того, как он может запустить какой-либо скрипт. Если использовать ini_set() с любым из этих параметров, то он меняет значение, однако оно уже нигде не будет использоваться. Слишком поздно - слой БВ уже запущен и активен. Изменить эти параметры можно, отредактировав php.ini или применив ключ –d к бинарнику PHP.

По умолчанию в php.ini, идущем в составе поставки PHP, output_buffering присвоено значение «4096» (байт). Если вы не используете php.ini (или запускаете PHP с ключом –n ), то значением по умолчанию будет «0», то есть отключено. Если захардкодить значение «On», то будет назначен стандартный размер буфера вывода (16 КБ).

Как вы уже, наверное, догадались, использование буфера для вывода в веб-окружении благотворно влияет на производительность. Начальных 4 КБ вполне достаточно, ведь это означает, что вы можете записать до 4096 ASCII-символов, пока PHP не начнёт взаимодействовать с нижерасположенным слоем SAPI. В условиях веба отправка данных побайтно, напротив, производительность не улучшает. Гораздо лучше, если сервер отправляет весь контент скопом или большими частями. Чем реже уровни обмениваются данными, тем лучше с точки зрения производительности. Поэтому обязательно используйте буфер вывода. PHP отправит его содержимое в конце запроса и вам для этого ничего не придётся делать.

В предыдущей главе я упоминал об implicit_flush в контексте CLI. В случае с любым другим SAPI implicit_flush изначально отключён. Это хорошо, поскольку вряд ли вы будете приветствовать сброс SAPI сразу же после записи в него. Для протокола FastCGI сброс можно сравнить с завершением и отправкой пакета после каждой записи. Однако лучше сначала полностью заполнить буфер FastCGI, а уже потом слать пакеты. Если вам нужно вручную сбросить буфер SAPI, используйте для этого PHP-функцию flush() . Для сброса после каждой записи, как уже говорилось выше, можно использовать параметр implicit_flush в php.ini. Как вариант - однократный вызов PHP-функции ob_implicit_flush() .

К содержимому буфера до его вывода можно применять callback output_handler . Вообще, благодаря расширениям PHP нам доступно немало callback-ов (пользователи тоже могут их писать, об этом я расскажу в следующей главе).

  • ob_gzhandler: компрессия вывода с помощью ext/zlib
  • mb_output_handler: перевод кодировки символов с помощью ext/mbstring
  • ob_iconv_handler: перевод кодировки символов с помощью ext/iconv
  • ob_tidyhandler: очистка вывода HTML с помощью ext/tidy
  • ob__handler: компрессия вывода с помощью ext/http
  • ob_etaghandler: автоматическая генерация заголовков ETag с помощью ext/http

Вы можете использовать только один callback, который получит содержимое буфера и сделает полезные преобразования для вывода, что не может не радовать. Для анализа данных, которые PHP отправляет веб-серверу, а тот отсылает пользователю, полезно использовать callback-и буфера вывода. Кстати, под «выводом» я подразумеваю как заголовок, так и тело. HTTP-заголовки тоже являются частью слоя буферизации вывода.

Тело и заголовки

Когда вы используете буфер вывода (неважно, пользовательский или один из стандартных), то можете отправлять HTTP-заголовки и содержимое как угодно. Любой протокол требует сначала отсылать заголовок, а уже потом тело, но за вас это сделает сам PHP, если вы используете слой БВ. Любая PHP-функция, работающая с заголовками (header(), setcookie(), session_start() ), фактически использует внутреннюю функцию sapi_header_op(), которая просто заполняет буфер заголовков. Если после этого записать выводимые данные, например, с помощью printf() , то они запишутся в один из соответствующих буферов вывода. И во время отправки буфера PHP сначала

Отсылает заголовки, а уже потом тело. Если вам не нравится такая забота со стороны PHP, то придётся вообще отключить слой БВ.

Пользовательские буферы вывода

Давайте разберём на примерах, как это работает, и что вы можете сделать. Имейте в виду, что если вы хотите использовать стандартный PHP-слой буферизации, то не сможете воспользоваться CLI, поскольку он отключается как слой.

Ниже приведён пример работы со стандартным PHP-слоем с помощью внутреннего веб-сервера SAPI:

/* запущено так: php -doutput_buffering=32 -dimplicit_flush=1 -S127.0.0.1:8080 -t/var/www */ echo str_repeat("a", 31); sleep(3); echo "b"; sleep(3); echo "c";

Мы запустили PHP со стандартным буфером вывода на 32 байта, после чего сразу же записали в него 31 байт, пока не включилась задержка исполнения. Экран чёрный, пока ничего не отправлено. Затем действие sleep() заканчивается, и мы записываем ещё один байт, тем самым полностью заполняя буфер. После этого он сразу же сбрасывает себя в буфер слоя SAPI, а тот сбрасывает себя в вывод, поскольку implicit_flush имеет значение 1. На экране появляется строка aaaaaaaaaa{31 раз}b , после чего опять начинает действовать sleep() . По его завершении пустой 31-байтный буфер заполняется одним-единственным байтом, после чего PHP завершается и сбрасывает буфер. На экране появляется с .

Так выглядит работа стандартного PHP-буфера без вызова каких-либо ob-функций. Не забудьте, что это именно стандартный буфер, то есть он уже имеется в наличии (только нельзя использовать CLI).

Теперь с помощью ob_start() можно запускать пользовательские буферы, причем столько, сколько нужно, пока память не закончится. Каждый буфер будет помещаться за предыдущим и немедленно сбрасываться в следующий, что постепенно приведёт к переполнению.

Ob_start(function($ctc) { static $a = 0; return $a++ . "- " . $ctc . "\n";}, 10); ob_start(function($ctc) { return ucfirst($ctc); }, 3); echo "fo"; sleep(2); echo "o"; sleep(2); echo "barbazz"; sleep(2); echo "hello"; /* 0- FooBarbazz\n 1- Hello\n */

Устройство буферизации вывода

Как я уже говорил, начиная с версии 5.4 механизм буферизации вывода был полностью переписан. До этого код был очень неаккуратным, многие вещи сделать было непросто, часто возникали баги. Подробнее об этом можно почитать по ссылке . Новая кодовая база получилась гораздо чище, лучше организована, появились новые возможности. Правда, совместимость с версией 5.3 обеспечивается лишь отчасти.

Пожалуй, одним из самых приятных нововведений стало то, что расширения теперь могут объявлять свои callback-и буфера вывода, конфликтующие с callback-ами других расширений. Ранее было невозможно полностью управлять ситуациями, когда другие расширения тоже могли декларировать свои callback-и.

Вот небольшой пример на скорую руку, демонстрирующий, как можно зарегистрировать callback, преобразующий данные в верхний регистр:

#ifdef HAVE_CONFIG_H #include "config.h" #endif #include "php.h" #include "php_ini.h" #include "main/php_output.h" #include "php_myext.h" static int myext_output_handler(void **nothing, php_output_context *output_context) { char *dup = NULL; dup = estrndup(output_context->in.data, output_context->in.used); php_strtoupper(dup, output_context->in.used); output_context->out.data = dup; output_context->out.used = output_context->in.used; output_context->out.free = 1; return SUCCESS; } PHP_RINIT_FUNCTION(myext) { php_output_handler *handler; handler = php_output_handler_create_internal("myext handler", sizeof("myext handler") -1, myext_output_handler, /* PHP_OUTPUT_HANDLER_DEFAULT_SIZE */ 128, PHP_OUTPUT_HANDLER_STDFLAGS); php_output_handler_start(handler); return SUCCESS; } zend_module_entry myext_module_entry = { STANDARD_MODULE_HEADER, "myext", NULL, /* Function entries */ NULL, NULL, /* Module shutdown */ PHP_RINIT(myext), /* Request init */ NULL, /* Request shutdown */ NULL, /* Module information */ "0.1", /* Replace with version number for your extension */ STANDARD_MODULE_PROPERTIES }; #ifdef COMPILE_DL_MYEXT ZEND_GET_MODULE(myext) #endif

Подводные камни

По большей части они задокументированы, некоторые из них вполне очевидны, а некоторые не слишком. К очевидным можно отнести, например, то, что не следует вызывать какие-либо функции буфера изнутри callback-а БВ, также как и записывать выводимые оттуда данные.

К неочевидным подводным камням можно отнести то, что некоторые функции PHP используют внутренний БВ для самих себя, заполняя его, а затем сбрасывая или возвращая. При этом следующий буфер ставится в стек. К подобным функциям относятся print_r(), highlight_file() и SoapServer::handle() . Не следует использовать их изнутри callback-а БВ – это может привести к непредсказуемым последствиям.

Заключение

Слой вывода можно сравнить со своеобразной сетью, которая улавливает любые возможные «утечки» вывода из PHP и сохраняет их в буфере заданного размера. Когда буфер заполняется, он сбрасывается (записывается) в нижний уровень, если таковой есть. Как минимум в самый нижний из имеющихся - в буфер SAPI. Пользователи могут управлять количеством буферов, их размером и операциями, которые могут быть разрешены в каждом слое буфера (очистка, сброс или удаление). Это очень гибкий инструмент, позволяющий, например, создателям библиотек и фреймворков полностью контролировать поток вывода, направляя его в глобальный буфер и обрабатывая там. При этом PHP сам регулирует порядок отправки заголовков и потока вывода.

По умолчанию имеется один буфер вывода, управляемый тремя настройками в ini-файле. Он устроен так, чтобы реже осуществлять операции записи и не слишком часто обращаться к слою SAPI, а значит и к сети. Это сделано для улучшения общей производительности. Также расширения PHP могут декларировать callback-и, запускаемые в каждом буфере - например, для компрессии данных, замены строк, управления HTTP-заголовками и многих других операций.

Эту статью, я хотел бы посвятить вопросу, который волнует многих начинающих пользователей -

Вы, наверняка, очень часто слышали в разговоре «бывалых» компьютерщиков, что они скопировали что-либо в буфер обмена , или в статьях, или в книжках, были слова про эту штуку, но что это такое не объяснялось. Так что это и где находится буфер обмена , сейчас я вам и расскажу.

Что такое буфер обмена, на нормальном языке?

Сначала дам определение, которое дается во всех компьютерных словарях. Буфер обмена — промежуточное хранилище данных, предоставляемое программным обеспечением и предназначенное для переноса или копирования между приложениями или частями одного приложения. Приложение может использовать свой собственный буфер, доступный только в нём, или общий, предоставляемый операционной системой или другой средой через определённый интерфейс.

А теперь объясню своими словами.

Буфер обмена - это невидимая часть памяти, в которое временно сохраняется информация, которую вы скопировали, перед тем, как вставить в нужное место. То есть, вы выделили какой-либо файл(ы), папку(и), текст, или что-нибудь другое, нажали правой кнопкой мыши, после чего нажали на пункт «Копировать» или просто нажали Ctrl+C (горячая клавиша), подробнее читайте .

Они скопировались в невидимую часть

После чего, вы перешли в нужное место, нажали правой кнопкой мыши и выбрали пункт «Вставить» или нажили на клавиатуре комбинацию Ctrl+V.

И теперь, то, что вы скопировали, вставилось туда, куда вам нужно. Вот и все. Надеюсь, вы поняли, где находится буфер обмена - нигде:).

Причем, скопированную информацию, можете вставлять много раз. Она храниться в этой самой невидимой части памяти, до тех пор, пока вы не скопируете что-нибудь новое.

То есть, вы скопировали папку, она сохранилась в буфер обмена, вставили её в одно место, в другое, в пятое в, десятое. А потом взяли да скопировали другую папку, так вот, первая автоматически стирается из него.

И еще, в буфере, скопированная информация хранится до тех пор, пока вы не перезагрузите или выключите компьютер. Т.е. предположим, вы что-то скопировали и вас отвлекли, вы отошли от компьютера, вас не было час, два, пять, вы возвращаетесь и можете смело вставлять скопированную информацию в нужное место. Только при условии, что вы не выключали и не перезагружали компьютер.

Кстати, еще, иногда, буфер обмена называют, просто, буфер, это чтоб вы знали.

Как очистить буфер обмена от скопированных файлов?

Честно говоря, очистка буфера обмена , не должна вызывать у вас трудности. Чистить буфер обмена надо потому, что, то невидимое пространство, в котором храниться копируемая информация, тоже занимает память на вашем компьютере, причем занимается эта память на системном диске (на диске С, подробнее о нем можете прочитать в данной статье — ). И если вы скопировали какой-то огромный файл, например, фильм высокого разрешения, то вам, после копирования, лучше очистить буфер обмена, чтобы он не нагружал память.

Многие мастера предлагают, различные программы для этого дела, но есть метод проще. После того, как вы скопировали большой объем информации, из буфера обмена, в то место, в которое вам надо, просто выделите какой-нибудь текст (можно даже одно слово), нажмите правой кнопкой мыши, после «Копировать» или просто нажмите Ctrl+C и все. Тот, огромный по весу файл, удалиться и на его месте появиться маленький кусочек текста, который почти ничего не весит.

Очищать буфер обмена нужно только тогда, когда вы копируете то, что много весит, каждый раз производить очистку нет необходимости.

Дополнение.

В общем, предыдущая версия статьи, которую вы прочитали выше, вызвала целую войну в комментариях, и сейчас я расскажу почему.

Я уже много раз говорил, и регулярно повторяюсь в статьях, что данный сайт для новичков. То есть для людей, которые или вообще не владеют компьютером, или владею им плоховато. Но почти каждый раз, в комментариях, находятся «умники», которые обливают статью грязью. Говорят, что она написана не профессионально. Господа «умники», я повторюсь еще раз - этот сайт для новичков, и моя задача, дать ответ, на поставленный ими вопрос так, чтобы они в нем разобрались, а не запутались.

Я бы сказал, куда идти тем «не хорошим людям», которые выражаются в комментариях, думая, что я не знаю, где находиться буфер обмена, но посыл их в пешее эротическое путешествие, навряд ли поднимет меня в глазах людей, нормально относящихся к этой статье.

Основной темой для споров, в комментариях к статье, вызвал ответ на вопрос — где же все-таки находиться этот буфер обмена ? И так как там, началась целая война, я решил ответить расширенно на данный вопрос.

Где находится буфер обмена в Windows 7 и Vista?

Начну я ответ на данный вопрос не с Windows 7 и Vista, а с XP.

В Windows XP буфер обмена можно было легко найти. Все что вы скопировали, хранилось в файле clipbrd.exe . Путь к нему был такой: Диск C (системный диск) -> папка WINDOWS -> папка system32 -> clipbrd.exe. И если бы вы открыли его, то обнаружили бы в нем тот текст или картинку (или что-либо другое), которую вы скопировали.

Что касается систем Windows 7 и Vista, то там уже файла clipbrd.exe нет, там есть файл clip.exe и если вы попробуете его открыть, то у вас ничего не получиться. Хотя при наведении мышкой на данный файл, высветиться пояснительное окно с описанием, и там будет написано «Clip - копирование данных в буфер обмена». Именно этот файл отвечает в Windows 7 и Vista за буфер обмена, но к нему нет доступа.

Можно конечно скопировать файл clipbrd.exe в папку system32 систем Windows 7 и Vista, в интернете есть много инструкций, но вопрос - зачем?

Во многих статьях о буфере обмена, написано что-то типа - в Windows XP была эта архи важная функция, но по какой-то причине разработчики убрали её. Вопрос к тем, кто кидал разные претензии по этому поводу в комментариях - зачем новичку эта функция? Вопрос, наверняка, ввел многих «умников» в ступор, потому что ответ, скорее всего, будет однозначен - незачем. В итоге, если бы я ответил на вопрос, где находиться буфер обмена, подобным образом, я бы еще больше запутал людей, и вместо ответа у них была бы каша в голове. Однако, если вам вдруг, по какой-либо причине, нужно брать из буфера обмена предыдущие записи, то эта настройка есть в программе Punto Switcher, подробнее о ней вы можете прочитать в данной статье —

Некоторые начинающие пользователи могут спросить - почему же ты сразу нам не сказал, что в Windows XP, буфер , можно «пощупать»? Ответ, я говорил, и не раз - начинающим пользователям, не стоит лишний раз залазить в файл Windows, потому что там находиться все и вся операционной системы. Не дай Бог, вы решите что-то «отредактировать», или случайно удалите что-нибудь «лишнее», то вся работоспособность системы может быть нарушена. Так что как только посмотрите это самый файл clipbrd.exe, сразу же уходите оттуда, чтобы не натворить дел, которые, чаще всего, творятся случайно.

Ну вот и все, надеюсь данная статья будет вам полезной. Всем удачи, пока!

P.S. Все комментарии с нецензурной лексикой были удалены.

Зачем нужна буферизация вывода в PHP? Что это такое? Как ее реализовать? Ответы на эти вопросы вы найдете в нашей статье. Сейчас мы детально рассмотрим практическое применение php буферизации и посмотрим реальные примеры. Как и во всяком деле поставим для себя цели и будем их достигать понемногу:

Слово буферизация говорит само за себя, это значит, что мы что-то копируем, помещаем в буфер. В php, буферизация позволяет скопировать определенную часть выводимого контента (html) в браузер, обработать ее нужными нам функциями и показать его пользователю. Зачем это нам? Например, можно реализовать , или замены некоторых сущностей на другие, да что угодно. Более детально рассмотрим применение php буферизации в последнем пункте статьи.

Реализация буферизации вывода в PHP

Буферизация начинается с функции ob_start();. После ее объявления буферизироваться будет все, что выводится в окно браузера. Аргумент callback это пользовательская функция, через которую можно пропустить и обработать выводимый текст, она должна возвращать одну строку.

ob_end_clean(); - завершает буферизацию и чистит буфер, но в браузер ничего не посылается.

Существует много функций для работы с буферизацией вывода в php. Сейчас посмотрим маленький практический пример для большей ясности дела. Например, у Вас генерируется страница, но при этом необходимо в тексте страницы заменить все буквы "ё" на буквы "е. Тогда делается примерно такое:

генерируется страница;

$page = ob_get_contents();

$page = str_replace("ё", "е", $page);

Применение буферизации вывода

Рассмотрим некоторые практические стороны применения буферизации вывода. Как уже упоминалось, предположительно мы имеем часть выводимого html кода или весь выводимый код. Что же с ним можно сделать?

Реализация автообновления на вашем сайте.

Обновление в смысле обновление контента. Посмотрев лекции Каширина, я узнал, что для того, что-бы страничка сайта была обновляемой в глазах поискового робота, необходимо, что-бы 25% содержимого страницы поменялось коренным образом. В начале, я просто создавал блок анонса, который выводил 25% символов от статьи, блок был одним и тем же на всех страницах, обновлялся 1 раз в сутки, выбирался случайным образом из массы всех статей. Он выглядел таким образом:

Но здесь была проблемка, одна статья была на 1500 символов, другая на 10000 символов, и если анонсом выбиралась та, что на 10000 символов, и анонс отображался на той статье в которой 1500 символов, то получалось что блок анонса составлял 5000 символов, это гораздо больше, нежели сама статья. Может, вы думаете, что нужно было, узнать количество символов исходной статьи и вывести в 4 раза меньше в анонсе. Я тоже так думал, но есть еще много факторов, таких как комментарии, новости сайта… В общем, нужно было знать количество символов всей странички, в этом мне помогла php буферизация или php буферизация вывода, называйте как хотите. Ниже код как я это реализовал.

// Текст странички после … в общем вся страница до того места где нужно вставить блок анонса

В файле anons.php, узнаем количество символов контента страницы без html тегов используя функции strip_tags() и strlen(). Далее дело техники, вычисляем блок анонса, его html код пишем в $show_anons и прицепляем после буферизированного контента ($buffer). Вот так вот мне помогла буферизация вывода в php. Ниже, скриншоты блока анонса, написанного с помощью использования php буферизации.

Вполне приличные блоки анонсов. Автообновление странички организовано, кричу УРА php буферизации.

Сжатие html кода

Об этом у меня есть отдельно написанная статья: , но я предоставлю пример php кода, в нем тоже используется PHP буферизация.

[^S ]+/s","/[^S ]+","<","1"); return preg_replace($i, $ii, $compress); } ?>

Другие варианты

Как видите применению буферизации вывода в php, нет предела. Наверняка у вас уже появились свои идеи, как реализовать те или иные штучки на своем сайте. Спасибо за внимание, надеюсь моя статья была вам полезной. Кстати, если имеете еще идеи по поводу применения php буферизации, пишите в комментариях ниже.

Буфер обмена Windows позволяет перемещать фрагменты текста или определённые данные между открытыми приложениями. Однако, его можно сделать ещё более эффективным!

Помните уже старый анекдот когда профессор спрашивал у студента, какова была методика написания его дипломной работы? - CTRL+C - CTRL+V, - ответил студент. Но, наверняка, он, как и многие другие пользователи ПК, не задумывался, за счёт чего работают эти "волшебные" сочетания клавиш, позволяющие копировать и вставлять практически любые данные...

А работают они благодаря такой замечательной штуке, как буфер обмена. И сегодня мы с Вами разберёмся что это такое, где его искать и как оптимизировать работу с ним!

Что такое буфер обмена

Буфер обмена - это функция операционной системы (не только Windows), которая позволяет временно хранить определённый фрагмент данных (или даже целый файл) в специально отведённой области оперативной памяти. При этом, если размер файла больше, чем ОЗУ на компьютере, то в качестве дополнительного временного хранилища задействуется файл подкачки (если он активен).

Поместить какую-либо информацию в буфер обмена, предварительно выделив её, можно операциями копирования или вырезания . При этом копирование не затрагивает оригинал, помещая в буфер лишь его копию, а вырезание выполняет функцию перемещения оригинала, удаляя его. Получить же данные из буфера обмена можно командой вставки . Все вышеупомянутые команды можно вызвать несколькими способами:

  1. При помощи контекстного меню . Выделяем подлежащие копированию объекты и кликаем по ним правой кнопкой мыши. В открывшемся меню можно выбрать пункты "Копировать" и "Вырезать" или "Вставить".
  2. При помощи меню "Правка" . Большинство программ Windows имеют в верхней части специальную строку меню. В этой строке, как правило, есть раздел "Правка", который содержит нужные нам команды.
  3. При помощи горячих клавиш . Наиболее быстрый способ взаимодействия с буфером обмена - использование клавиатурных комбинаций:
  • CTRL+X (SHIFT+DEL) - "Вырезать";
  • CTRL+C (CTRL+Insert) - "Копировать";
  • CTRL+V (SHIFT+Insert) - "Вставить".

Ещё одной особенностью буфера обмена является то, что он один и тот же скопированный объект может хранить в нескольких форматах одновременно и выдаёт программе, запросившей его, тот формат, который либо сопоставлен программе по умолчанию, либо имеет наивысший приоритет и информативность.

Приведём простейший пример. Допустим, мы скопировали с сайта строку некоего форматированного текста. Если вставить этот текст в текстовый процессор, вроде Microsoft Office Word или OpenOffice Writer, то мы получим его оригинальную копию с сохранением всех особенностей форматирования (жирность текста, междустрочные отступы и т.п.).

Если вставить этот же фрагмент текста в текстовый редактор класса Блокнота, то сам текст сохранится, но его форматирование нет, поскольку Блокнот не поддерживает форматирование и будет запрашивать из буфера обмена именно неформатированную версию. Наконец, если попытаться вставить наш текст в некоторые графические редакторы, то они либо вообще ничего не вставят, либо вернут нам нашу надпись в растрированном виде!

Таким образом, мы видим, что простенькая, на первый взгляд, всем известная функция системы - не такая уж и простая, если вникнуть поглубже! Поэтому, давайте немного вникнем:)

Особенности буфера обмена в разных версиях Windows

В Windows 2000 и XP существовал способ просмотра и управления содержимым буфера обмена. Это была утилита под названием "Папка обмена". Запускалась она при помощи исполняемого файла по адресу C:\Windows\System32\clipbrd.exe (WIN+R - clipbrd.exe - ENTER):

Данная утилита позволяла не только просматривать, что находится в данный момент в буфере, но также давала возможность сохранить данные в файл (формат CLP), восстановить их из ранее сохранённого файла, очистить буфер и даже изменить формат данных для вставки (см. меню "Вид" на скриншоте выше).

Из последующих версий Windows утилита, почему-то, была удалена (хотя, при желании Вы можете и программа будет работать даже на Windows 10). Вместо неё осталось только небольшое консольное приложение по адресу C:\Windows\System32\clip.exe. Запустить его напрямую нельзя, но можно вызвать из Командной строки (WIN+R - cmd - ENTER):

Небольшая справка по команде "clip" (или "clip.exe") покажет нам, что команда не имеет никаких параметров. Она позволяет перенаправить содержимое буфера в файл (обычно в формате TXT) или считать его из ранее созданного файла посредством указания направления копирования при помощи треугольной скобки (clip > файл - запись в файл или clip < файл - чтение из файла). Вторым примером использования команды является копирование в буфер содержимого указанной перед вертикальной чертой папки (адрес_папки | clip ).

Однако, есть и один секрет, который позволяет при помощи как раз последнего примера очистить буфер обмена (полезно, если там хранится большой файл). Для этого в Командной строке прописываем следующее: echo off | clip . Как видите, вместо адреса папки для копирования мы прописали стандартную консольную команду отключения вывода данных и поместили её в буфер. Поскольку команда не возвращает никаких данных, она просто очищает буфер обмена:

Чтобы каждый раз не "нырять" в Командную строку для очистки буфера, можно создать специальный ярлык, который будет делать это автоматически! Для этого в качестве объекта укажите следующую строку: C:\Windows\System32\cmd.exe /c "echo off | clip" и сохраните созданный ярлык. Учтите, что в Windows XP приведённый выше пример не будет работать, поскольку там вместо консольной утилиты CLIP используется рассмотренная выше графическая программа Clipbrd.exe, которая управляет буфером обмена!

Программы для работы с буфером обмена

Штатный буфер обмена Windows - вещь очень полезная. Но, увы, она не лишена и недостатков. Основным из них является то, что буфер может хранить в себе только один набор данных, который тут же перезаписывается новой информацией, если мы копируем ещё что-то. Также порой бывает нужно вставлять определённые фрагменты данных и хорошо бы было, если бы буфер мог сохранять их даже после перезагрузки ПК.

Подобные мысли посещали многих, поэтому на сегодняшний день имеется довольно много специализированных и комплексных решений по улучшению работы буфера обмена. И о некоторых из них хотелось бы рассказать более подробно.

Punto Switcher

Наверняка, многие из Вас знают (а, может, и используют) замечательную программу для автоматического переключения раскладки клавиатуры Punto Switcher . Однако, кроме переключения клавиатуры, она имеет ещё много полезных функций, в том числе, для расширения возможностей буфера обмена:

Во-первых, программа может реализовать мультибуфер с запоминанием всех текстовых фрагментов, которые были скопированы ранее. Во-вторых, она имеет модуль Дневник , который позволяет автоматически сохранять по дням всё, что вводилось с клавиатуры или копировалось проходило через буфер обмена. Дневник активируется в специальном разделе настроек весьма просто, а с мультибуфером придётся чуть сложнее...

Сначала нам нужно активировать опцию "Следить за буфером обмена" в разделе настроек "Общие" на вкладке "Дополнительные" (см. скриншот выше). Вторым шагом нужно настроить сочетание клавиш, которое будет открывать доступ к истории буфера обмена. Для этого идём в раздел настроек "Горячие клавиши" и назначаем сочетание для функции "Показать историю буфера обмена" :

Теперь по нажатию заданной нами клавиатурной комбинации будет появляться небольшое окошко по типу контекстного меню, которое будет хранить в себе текстовые фрагменты, копируемые ранее в буфер обмена, а также функцию очистки буфера. Для вставки нужного текста достаточно просто кликнуть по нему:

Использование Punto Switcher в качестве менеджера буфера обмена выгодно тем, что не нужно устанавливать никаких дополнительных утилит. Лично я настроил мультибуфер на всех компьютерах, с которыми работаю, поскольку это реально удобно. Однако, у данного решения есть и ряд минусов ...

Во-первых, Punto Switcher не умеет сохранять фрагменты изображений. Во-вторых, не имеет удобного механизма восстановления содержимого буфера из предыдущих сессий (вытаскивание нужных записей из Дневника не в счёт). И, наконец, время от времени функция слежения за буфером обмена просто отключается по непонятным причинам... Поэтому, возможно, стоит посмотреть и на некоторые узкоспециализированные утилиты.

CLCL

Первым делом хочу обратить Ваше внимание на одну программу японского происхождения - CLCL :

Данный менеджер буфера обмена по праву считается одним из лучших, ведь сочетает в себе практически идеальный набор характеристик:

  • малый размер (всего около 300 КБ со всеми плагинами!);
  • поддержка и текстовых, и графических данных;
  • наличие истории копирования;
  • функция вставки часто используемых шаблонов;
  • управление горячими клавишами.

Плюс ко всему, CLCL является портативной программой и для своей работы не требует установки. Это позволяет настроить её всего раз и затем переносить на любой компьютер, с которым Вы работаете, сохраняя доступ к привычным функциям, где бы Вы ни были.

Стоит, правда, отметить, что CLCL имеет несколько версий. Русскоязычная версия 1.1.2 (которая есть на нашем сайте), увы, не обновлялась с 2005 года. Новая же ветка программы (2.0 от 2015 года) существует только на английском и японском языках. От своей более ранней реализации новая CLCL отличается расширенным набором поддерживаемых форматов (русскоязычная поддерживала только точечные рисунки, обычный текст и Юникод), а также более структурированным меню. В остальном же особых изменений нет, поэтому можно с успехом пользоваться старой версией (пока я не русифицирую новую:))).

Ditto

Если Вы не боитесь целой кучи настроек и хотите выжать максимум из своего буфера обмена, то Вам может понравиться программа :

Ditto по своему функционалу стоит практически в одном ряду с CLCL. Он "из коробки" поддерживает все возможные форматы буфера обмена (правда, многие из них по умолчанию отключены), имеет функцию запоминания скопированных фрагментов и систему вставки пользовательских шаблонов. Кроме того, он может похвастаться:

  • наличием поиска по сохранённым клипам (так здесь называются скопированные фрагменты);
  • группирование клипов;
  • импорт и экспорт сохранённых копий буфера обмена;
  • синхронизация содержимого буфера по сети;
  • поддержка работы с несколькими буферами обмена с переключением между ними.

В отличие от CLCL, Ditto имеет значительно большие размеры (около 15 МБ). Но и функционал, в принципе, намного шире. К тому же Ditto регулярно обновляется и имеет отдельные версии как под 32-битные, так и под 64-битные системы (в том числе и portable). Единственным недостатком программы для русскоязычного пользователя является не до конца русифицированный интерфейс, что в сочетании с большим количеством настроек может несколько сбить с толку неподготовленного новичка. Поэтому рекомендовать Ditto можно, скорее, уверенным пользователям ПК.

Clipdiary

Если Вы ищете программу с дружелюбным для простого пользователя русскоязычным интерфейсом и мощным функционалом, то стоит обратить внимание на Clipdiary :

Программа вообще-то платная, но русскоязычным пользователям доступна под бесплатной лицензией для некоммерческого использования. Чтобы снять ограничение на 30-дневный пробный срок зайдите в меню "Помощь" основного окна и кликните пункт "Активировать бесплатно". Откроется веб-страница, внизу которой Вам нужно будет нажать кнопку "Получить ключ", а затем скопировать полученный набор символов и вставить его в окошко регистрации Clipdiary.

После регистрации у Вас пропадёт отсчёт дней пробного периода и Вы без ограничений сможете воспользоваться всеми возможностями программы:

  • поиск по базе данных сохранённых клипов;
  • присвоение ярлыков клипам для быстрого доступа;
  • защита базы данных паролем;
  • выбор формата для вставки;
  • удобная сортировка и представление клипов.

Clipdiary имеет довольно простой и удобный интерфейс, который сочетается с весьма неплохим функционалом. Поэтому данная программа подойдёт одинаково хорошо как новичкам, так и продвинутым пользователям. Кстати, у неё также есть portable-версия, которая может работать без установки. Единственным недостатком является ограничение на использование в коммерческих организациях.

ClipAngel

Напоследок хотелось бы упомянуть об ещё одной достойной отечественной реализации менеджера буфера обмена :

Создана программа была только в начале 2017 года, но за недолгое время своего развития уже успела "дорасти" до вполне серьёзного и удобного инструмента, который может конкурировать с именитыми аналогами! В арсенале программы имеется:

  • автоматическое сохранение истории буфера обмена;
  • возможность отмечать для быстрого использования наиболее часто употребляемые клипы;
  • функция сравнения фрагментов клипов для выявления несоответствий;
  • удобные функции сортировки списка истории и поиска по нему;
  • выбор формата вставки клипа, а также его быстрый перевод онлайн.

ClipAngel поддерживает изначально все форматы буфера обмена и имеет весьма простой интерфейс настройки. Кроме того, в программу встроен небольшой текстовый редактор, который можно использовать для быстрой правки текста в сохранённых клипах! Для доступа же к наиболее востребованным функциям Вы можете задать собственные "горячие" клавиши.

ClipAngel не требует установки, а его размер в 3 МБ значительно меньше, чем у большинства аналогов. Единственный недостаток программы в том, что она написана на.NET Framework 4.5, поэтому потребляет сравнительно больше ресурсов ПК, нежели подобные приложения, созданные на языках более низкого уровня.

Выводы

Буфер обмена - очень удобная функция операционной системы. Однако, как мы могли убедиться, существует достаточно способов улучшить его, существенно расширив функционал и удобство. Все рассмотренные выше программы для управления историей буфера являются достойными кандидатами на роль менеджера буфера обмена, поэтому выбор любой из них будет верным решением!

Заведите на своём ПК небольшого "помощника" и забудьте о постоянных копированиях-вставках. Теперь все нужные фрагменты текста и картинок будут доступны Вам буквально в два клика!

P.S. Разрешается свободно копировать и цитировать данную статью при условии указания открытой активной ссылки на источник и сохранения авторства Руслана Тертышного.

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

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

Примечание : Статья написана для начинающих пользователей и поэтому не содержит в себе большую часть технических аспектов.

Что такое буфер обмена и к чему он относится?

Буфер обмена или clipboard - это промежуточное хранилище данных, которое позволяет переносить или копировать данные между частями программ или разными программами. При этом такие хранилища обязательно должны поддерживать три вида операций - копировать, вырезать и вставить. Стоит знать, что буфер обмена хоть и является чисто программной возможностью, то есть это не аппаратное устройство, а программный механизм и у каждой утилиты он может быть свой собственный, чаще всего при словах буфер обмена имеют ввиду именно хранилище операционной системы Windows, которое входит в ее состав по умолчанию.

По этой причине, я больше сосредоточусь именно на буфере обмена Windows, так как у каждой программы промежуточное хранилище данных может быть реализовано со своими спецификами, а хранилище операционной системы практически не меняется от версии к версии.

Важная особенность - данные во временном хранилище Windows хранятся до перезагрузки компьютера или выхода из системы.

Стоит знать, что буфер обмена Windows позволяет единовременно хранить только что-то одно, однако в разных форматах. В первом случае речь идет о том, что если вы скопировали какой-то текст, а после скопировали картинку или файл, то текст больше не будет храниться в буфере обмена. Во второй части речь идет о том, что в этом хранилище может храниться как текст, так и картинка, так и файлы (не их содержимое, а их адреса). При этом стоит знать, что текст может храниться даже вместе с картинками и оформлением. К примеру, если вы откроете любую веб-страницу, выделите ее всю и скопируете, то при вставке, например, в в документ OpenOffice, практически все с сайта будет скопировано, включая стили и картинки. Это делает хранилище Windows весьма удобным в использовании.

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

Примечание : Вам так же может быть интересен обзор бесплатных программ буфера обмена , значительно расширяющих возможности временного хранилища.

Горячие клавиши для буфера обмена Windows

В Windows поддерживается ряд горячих клавиш для копирования, вырезания и вставки в буфер обмена. Эти комбинации доступны практически в любых программах, единственное условие (при условии, что программы не блокируют возможности временного хранилища), что у вас должна быть возможность выделить текст, картинку или любой другой элемент с помощью мышки. Так например, некоторые всплывающие окошки с ошибками не поддерживают этого и приходится набирать текст вручную или создавать скриншот . Если же программа поддерживает буфер обмена, то для копирования и вырезания вам нужно лишь выделить необходимую информацию, а для вставки указать курсором то месте, куда вы хотите поместить информацию.

А вот и сами комбинации:

1. "Ctrl + C " - копирование выделенной части во временное хранилище

2. "Ctrl + X " - копирование во временное хранилище и удаление из места, где было скопировано. Стоит понимать, что если программа не поддерживает удаление текста, картинки и прочих объектов, то эта комбинация будет действовать аналогично предыдущей.

3. "Ctrl + V " - вставить данные из буфера обмена в указанное место. Стоит знать, что вы можете вставлять информацию сколько угодно раз, так как вставка не приводит к очищению буфера обмена.

Примечание : Комбинации действуют вне зависимости от раскладки клавиатуры и активного языка. Другими словами, вам не нужно каждый раз переключаться или делать что-то подобное.



© 2024 beasthackerz.ru - Браузеры. Аудио. Жесткий диск. Программы. Локальная сеть. Windows