Добавление поддержки CLR к вашему C ++-приложению только для того, чтобы получить класс Mutex чрезмерно. Существует несколько вариантов синхронизации вашего доступа к файлам между двумя приложениями.
Если вам нужно записать файл из нескольких процессов, использование мьютекса - это хороший способ сделать это. Используйте функции mutex в Win32 API. (Класс .Net Mutex - это всего лишь оболочка вокруг этих функций.)
HANDLE mutex = CreateMutex(NULL, false, "MyMutex");
DWORD waitResult = WaitForSingleObject(mutex, INFINITE);
if (waitResult == WAIT_OBJECT_0)
{
// TODO: Write the file
WriteFile(...);
ReleaseMutex(mutex);
}
Как уже отмечалось в другом ответе, вам нужно будет открыть файл с общим доступом, чтобы обе ваши приложения могли открывать это сразу. Однако этого может быть недостаточно: если оба ваших приложения пытаются записать в одну и ту же область файла, вам все равно нужно будет убедиться, что одновременно записывается только одно приложение. Представьте, что если оба приложения смотрят на размер файла, то оба попытаются одновременно записать на это смещение байта: даже если оба пытались просто добавить к концу файла, они оказались сбиты друг с другом.
Если вы чисто записываете в конец файла и никогда не пытаетесь ничего прочитать или писать где-нибудь, кроме самого конца файла , то есть специальный режим, который вы можете использовать, что позволит вам не использовать мьютекс. Если вы откроете файл с dwDesiredAccess
, установленным на FILE_APPEND_DATA | SYNCHRONIZE
, и больше ничего (не включите FILE_WRITE_DATA
), тогда ОС позаботится о том, чтобы все данные, которые были записаны в файл в конце, и два приложения, записывающие данные, не перезаписывают друг друга. Это поведение задокументировано на MSDN :
Если установлены только флаги FILE_APPEND_DATA и SYNCHRONIZE, вызывающий может писать только в конец файла и любую информацию о смещении о записи в файл игнорируется.
blockquote>Опция 3: LockFile
Еще один путь, который вы можете предпринять, - использовать
LockFile
. С помощьюLockFile
(илиLockFileEx
) вы можете открыть оба файла для обоих приложений и заблокировать каждый файл раздела файла, который он хочет записать, , Это дает вам более гранулярность, чем мьютекс, позволяя одновременно выполнять неперекрывающиеся записи. (ИспользованиеLockFile
для всего файла даст вам тот же базовый эффект, что и мьютекс, с дополнительным преимуществом, которое предотвратит использование другими приложениями файла при этом.) Есть хороший пример того, как использоватьLockFile
на блоге Раймонда Чена .
Новый ответ:
На этой странице предлагается:
Реализация для всех версий Mac OS X
Другой модуль Mac (MacSharedClipboard.py в листинге 4) реализует интерфейс буфера обмена поверх двух программ командной строки, называемых pbcopy (который копирует текст в буфер обмена) и pbpaste (который вставляет любой текст буфер обмена). Приставка «pb» означает «монтажная доска», термин Mac для обозначения буфера обмена.
Старый ответ:
Очевидно так:
http://code.activestate.com/recipes/410615/
- это простой скрипт, демонстрирующий, как это сделать.
Редактировать: только что понял, что это зависит от углерода, поэтому не может быть идеальным ... зависит от того, для чего вы его используете.
Как записать строку Unicode в буфер обмена Mac:
import subprocess
def write_to_clipboard(output):
process = subprocess.Popen(
'pbcopy', env={'LANG': 'en_US.UTF-8'}, stdin=subprocess.PIPE)
process.communicate(output.encode('utf-8'))
Как прочитать строку Unicode из буфера обмена Mac:
import subprocess
def read_from_clipboard():
return subprocess.check_output(
'pbpaste', env={'LANG': 'en_US.UTF-8'}).decode('utf-8')
Работает как на Python 2.7, так и на Python 3.4.
Я знаю, что это старая статья, но я нашел очень элегантное решение этой проблемы.
Существует библиотека с именем PyClip , которую можно найти на https://github.com/georgefs/pyclip-copycat .
Синтаксис довольно прост (пример из репозитория Github):
import clipboard
# copy some text to the clipboard
clipboard.copy('blah blah blah')
# get the text currently held in the clipboard
text = clipboard.paste()
после прохождения clipboard.copy('foo')
вы можете просто cmd + v получить текст
Простой способ:
cmd = 'echo %s | tr -d "\n" | pbcopy' % str
os.system(cmd)
Кроссплатформенный способ:
https://stackoverflow.com/a/4203897/805627
from Tkinter import Tk
r = Tk()
r.withdraw()
r.clipboard_clear()
r.clipboard_append('i can has clipboardz?')
r.destroy()
В следующем коде используется PyObjC ( http://pyobjc.sourceforge.net/ )
from AppKit import NSPasteboard, NSArray
pb = NSPasteboard.generalPasteboard()
pb.clearContents()
a = NSArray.arrayWithObject_("hello world")
pb.writeObjects_(a)
Как описано в в документации по какао , для копирования требуется три шаг:
Заполнить монтажный щит массивом объектов (здесь a
содержит только одну строку).
Если вы просто хотите поместить текст в буфер обмена Mac, вы можете использовать команду оболочки pbcopy.