Перейти к содержимому

Как создать свое расширение файла

  • автор:

Разработка расширений на Python¶

Для разработки расширений можно использовать язык программирования Python. По сравнению с классическими расширениями, написанными на C++, их легче разрабатывать, понимать, поддерживать и распространять в силу динамической природы самого Python.

Расширения на Python перечисляются в Менеджере модулей QGIS наравне с расширениями на C++. Поиск расширений выполняется в следующих каталогах:

  • UNIX/Mac: ~/.qgis/python/plugins и (qgis_prefix)/share/qgis/python/plugins
  • Windows: ~/.qgis/python/plugins и (qgis_prefix)/python/plugins

В Windows домашний каталог (обозначенный выше как ~ ) обычно выглядит как C:\Documents and Settings\(user) . Вложенные каталоги в этих папках рассматриваются как пакеты Python, которые можно загружать в QGIS как расширения.

  1. Идея: Прежде всего нужна идея для нового расширения QGIS. Зачем это нужно? Какую задачу необходимо решить? Может, есть готовое расширения для решения этой задачи?
  2. Создание файлов: Подробнее этот шаг описан ниже. Точка входа ( __init.py__ ). Тело расширения ( plugin.py ). Форма QT-Designer ( form.ui ), со своим resources.qrc .
  3. Реализация: Пишем код в plugin.py
  4. Тестирование: Закройте и снова откройте QGIS, загрузите своё расширение. Проверьте, что всё работает как надо.
  5. Публикация: опубликуйте своё расширение в репозитории QGIS или настройте свой собственный репозиторий в качестве “арсенала” личного “ГИС вооружения”

Разработка расширения¶

С момента введения поддержки Python в QGIS появилось множество расширений — на странице Plugin Repositories можно найти некоторые из них. Исходный код этих расширений можно использовать, чтобы узнать больше о программировании с PyQGIS, а также для того, чтобы удостовериться, что разработка не дублируется. Готовы к созданию расширения, но отсутствует идея? На странице Python Plugin Ideas собрано много идей и пожеланий!

Создание необходимых файлов¶

Ниже показано содержимое каталога нашего демонстрационного расширения:

PYTHON_PLUGINS_PATH/ testplug/ __init__.py plugin.py metadata.txt resources.qrc resources.py form.ui form.py

Для чего используются файлы:

  • __init__.py = Точка входа расширения. Содержит общую информацию, версию расширения, его название и основной класс.
  • plugin.py = Основной код расширения. Содержит информацию обо всех действиях, доступных в расширении, а также основной код.
  • resources.qrc = XML-документ, созданный QT-Designer. Здесь хранятся относительные пути к ресурсам форм.
  • resources.py = Понятная Python версия вышеописанного файла.
  • form.ui = Интерфейс пользователя (GUI), созданный в QT-Designer.
  • form.py = Конвертированная в код Python версия вышеописанного файла.
  • metadata.txt = требуется в QGIS >= 1.8.0. Содержит общую информацию, версию расширения, его название и другие метаданые, используемые новым репозиторием расширений. Метаданным в metadata.txt отдается предпочтение перед методами из файла __init__.py . Если текстовый файл присутствует, именно он будет использоваться для получения этой информации. Начиная с QGIS 2.0 метаданные из __init__.py больше не будут использоваться и файл metadata.txt станет обязательным.

Здесь и вот здесь можно найти два способа автоматической генерации базовых файлов (скелета) типового Python расширения для QGIS. Кроме того, существует модуль Plugin Builder , который создает шаблон модуля прямо из QGIS и не требует соединения с Интернет. Это упростит работу и поможет быстрее начать разработку типового расширения.

Написание кода¶

__init__.py¶

Прежде всего, Менеджер модулей должен получить основные сведения о расширении, такие как его название, описание и т.д. Файл __init__.py именно то место, где должна быть эта информация:

def name(): return "My testing plugin" def description(): return "This plugin has no real use." def version(): return "Version 0.1" def qgisMinimumVersion(): return "1.0" def authorName(): return "Developer" def classFactory(iface): # загружаем класс TestPlugin из файла testplugin.py from testplugin import TestPlugin return TestPlugin(iface) 

В QGIS 1.9.90 модули могут быть помещены не только в меню Модули , но и в меню Растр , Вектор , База данных и Web . Поэтому было введено новое поле метаданных “category”. Это поле используется в качестве подсказки для пользователей и сообщает где (в каком меню) искать модуль. Допустимыми значениями для параметра “category” являются Vector, Raster, Database, Web и Layers. Например, если модуль должен быть доступен из меню Растр , добавьте в __init__.py следующие строки:

def category(): return "Raster" 

metadata.txt¶

Для QGIS >= 1.8 необходимо создать файл metadata.txt (см. также) Пример :file: ` metadata.txt’:

; the next section is mandatory [general] name=HelloWorld qgisMinimumVersion=1.8 description=This is a plugin for greeting the (going multiline) world category=Raster version=version 1.2 ; end of mandatory metadata ; start of optional metadata changelog=this is a very very very very very very long multiline changelog ; tags are in comma separated value format, spaces are allowed tags=wkt,raster,hello world ; these metadata can be empty ; in a future version of the web application it will ; be probably possible to create a project on redmine ; if they are not filled homepage=http://www.itopen.it tracker=http://bugs.itopen.it repository=http://www.itopen.it/repo icon=icon.png ; experimental flag experimental=True ; deprecated flag (applies to the whole plugin and not only to the uploaded version) deprecated=False

plugin.py¶

Стоит сказать несколько слов о функции classFactory() , которая вызывается когда расширение загружается в QGIS. Она получает ссылку на экземпляр класса QgisInterface и должна вернуть экземпляр класса вашего расширения — в нашем случае этот класс называется«TestPlugin«. Ниже показано он должен выглядеть (например, testplugin.py ):

from PyQt4.QtCore import * from PyQt4.QtGui import * from qgis.core import * # загружаем ресурсы Qt из файла resouces.py import resources class TestPlugin: def __init__(self, iface): # сохраняем ссылку на интерфейс QGIS self.iface = iface def initGui(self): # создаем действия для запуска расширения или его настройки self.action = QAction(QIcon(":/plugins/testplug/icon.png"), "Test plugin", self.iface.mainWindow()) self.action.setWhatsThis("Configuration for test plugin") self.action.setStatusTip("This is status tip") QObject.connect(self.action, SIGNAL("triggered()"), self.run) # добавляем кнопку на панель и пункт в меню self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("&Test plugins", self.action) # подключаемся к сигналу renderComplete, который посылается по завершению отрисовки карты QObject.connect(self.iface.mapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) def unload(self): # удаляем пункт меню и кнопку на панели self.iface.removePluginMenu("&Test plugins",self.action) self.iface.removeToolBarIcon(self.action) # отключаемся от сигнала карты QObject.disconnect(self.iface.MapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) def run(self): # создаем и показываем диалог настройки или выполняем что-то еще print "TestPlugin: run called!" def renderTest(self, painter): # рисуем на карте, используя painter print "TestPlugin: renderTest called!" 

Если используется QGIS 1.9.90 или старше и необходимо разместить модуль в одном из новых меню ( Растр , Вектор , База данных или Web ), нужно модифицировать код функций initGui() и unload() . Так как эти новые пункты меню доступны только в QGIS 1.9.90, прежде всего необходимо проверить, что используемая версия QGIS имеет все необходимые функции. Если новые пункты меню доступны, мы можем разместить модуль в нужном месте, в противном случае будем использовать меню Модули как и раньше. Вот пример для меню Растр :

def initGui(self): # создаем действия для запуска расширения или его настройки self.action = QAction(QIcon(":/plugins/testplug/icon.png"), "Test plugin", self.iface.mainWindow()) self.action.setWhatsThis("Configuration for test plugin") self.action.setStatusTip("This is status tip") QObject.connect(self.action, SIGNAL("triggered()"), self.run) # проверяем, доступно ли меню Растр if hasattr(self.iface, "addPluginToRasterMenu"): # меню Растр и одноименная панель доступны self.iface.addRasterToolBarIcon(self.action) self.iface.addPluginToRasterMenu("&Test plugins", self.action) else: # меню Растр отсутствует, размещаем модуль в меню Модули, как и раньше self.iface.addToolBarIcon(self.action) self.iface.addPluginToMenu("&Test plugins", self.action) # одключаемся к сигналу renderComplete, который посылается по завершению отрисовки карты QObject.connect(self.iface.mapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) def unload(self): # проверям доступно ли меню Растр и удаляем наши кнопки из соответствующего # меню и панели if hasattr(self.iface, "addPluginToRasterMenu"): self.iface.removePluginRasterMenu("&Test plugins",self.action) self.iface.removeRasterToolBarIcon(self.action) else: self.iface.removePluginMenu("&Test plugins",self.action) self.iface.removeToolBarIcon(self.action) # отключаемся от сигнала карты QObject.disconnect(self.iface.MapCanvas(), SIGNAL("renderComplete(QPainter *)"), self.renderTest) 

Полный список методов, которые можно использовать для размещения модуля в новых меню и на новых панелях инструментов доступен в описании API.

В расширении обязательно должны присутствовать функции initGui() и unload() . Эти функции вызываются когда расширение загружается и выгружается.

Файл ресурсов¶

Как видно в примере выше, в initGui() мы использовали иконку из файла ресурсов (в нашем случае он называется resources.qrc ):

  icon.png  

Хорошим тоном считается использование префикса, это позволит избежать конфликтов с другими расширениями или с частями QGIS. Если префикс не задан, можно получить не те ресурсы, которые нужны. Теперь сгенерируем файл ресурсов на Python. Это делается командой pyrcc4:

pyrcc4 -o resources.py resources.qrc

Вот и все. ничего сложного 🙂 Если всё сделано правильно, то расширение должно отобразиться в Менеджере модулей и загружаться в QGIS без ошибок. После его загрузки на панели появится кнопка, а в меню — новый пункт, нажатие на которые приведет к выводу сообщения на терминал.

При работе над реальным расширением удобно вести разработку в другом (рабочем) каталоге и создать makefile, который будет генерировать файлы интерфейса и ресурсов, а также выполнять копирование расширения в каталог QGIS.

Документация¶

Этот способ создания документации требует наличия Qgis версии 1.5.

Документацию к расширению можно готовить в виде файлов HTML. Модуль qgis.utils предоставляет функцию showPluginHelp() , которая откроет файл справки в браузере, точно так же как другие файлы справки QGIS.

Функция showPluginHelp`() ищет файлы справки в том же каталоге, где находится вызвавший её модуль. Она по очереди будет искать файлы index-ll_cc.html , index-ll.html , index-en.html , index-en_us.html и index.html , и отобразит первый найденный. Здесь ll_cc — язык интерфейса QGIS. Это позволяет включать в состав расширения документацию на разных языках.

Кроме того, функция showPluginHelp() может принимать параметр packageName, идентифицирующий расширение, справку которого нужно отобразить; filename, который используется для переопределения имени файла с документацией; и section, для передачи имени якоря (закладки) в документе, на который браузер должен перейти.

Фрагменты кода¶

Здесь собраны фрагменты кода, полезные при разработке расширений.

Как вызвать метод по нажатию комбинации клавиш¶

Добавьте в initGui() :

self.keyAction = QAction("Test Plugin", self.iface.mainWindow()) self.iface.registerMainWindowAction(self.keyAction, "F7") # action1 is triggered by the F7 key self.iface.addPluginToMenu("&Test plugins", self.keyAction) QObject.connect(self.keyAction, SIGNAL("triggered()"),self.keyActionF7) 
self.iface.unregisterMainWindowAction(self.keyAction) 

Метод, вызываемый по нажатию F7:

def keyActionF7(self): QMessageBox.information(self.iface.mainWindow(),"Ok", "You pressed F7") 

Как управлять видимостью слоя (временное решение)¶

Примечание: в QGIS 1.5 появился класс QgsLegendInterface , позволяющий управлять списком слоёв легенды.

Так как в настоящее время методы прямого доступа к слоям легенды отсутствуют, в качестве временно решения для управления видимостью слоёв можно использовать решение на основе изменения прозрачности слоя:

def toggleLayer(self, lyrNr): lyr = self.iface.mapCanvas().layer(lyrNr) if lyr: cTran = lyr.getTransparency() lyr.setTransparency(0 if cTran > 100 else 255) self.iface.mapCanvas().refresh() 

Метод принимает номер слоя в качестве параметры (0 соответствует самому верхнему) и вызывается так:

self.toggleLayer(3) 

Как получить доступ к таблице атрибутов выделенных объектов¶

def changeValue(self, value): layer = self.iface.activeLayer() if(layer): nF = layer.selectedFeatureCount() if (nF > 0): layer.startEditing() ob = layer.selectedFeaturesIds() b = QVariant(value) if (nF > 1): for i in ob: layer.changeAttributeValue(int(i),1,b) # 1 соответствует второй колонке else: layer.changeAttributeValue(int(ob[0]),1,b) # 1 соответствует второй колонке layer.commitChanges() else: QMessageBox.critical(self.iface.mainWindow(),"Error", "Please select at least one feature from current layer") else: QMessageBox.critical(self.iface.mainWindow(),"Error","Please select a layer")

Метод принимает один параметр (новое значения атрибута выделенного объекта(ов)) и вызывается как:

self.changeValue(50) 

Как выполнять отладку при помощи PDB¶

Сначала добавьте следующий код в место, которое будет отлаживаться:

# для отладки используем pdb import pdb # устанавливаем точку останова pyqtRemoveInputHook() pdb.set_trace() 

Затем запускаем QGIS из командной строки.

$ ./Qgis

$ /Applications/Qgis.app/Contents/MacOS/Qgis

Когда приложение достигнет точки останова, консоль станет доступной и можно будет вводить команды!

Тестирование¶

Публикация расширения¶

Если после создания расширения вы решите, что оно может быть полезно и другим пользователям — не бойтесь загрузить его в репозиторий QGIS plugin repository. На этой же странице можно найти инструкции по подготовке пакета, следование которым избавит от проблем с установкой расширения через Установщик модулей. В случае, когда нужно настроить собственный репозиторий, создайте простой XML документ, описывающий все расширения и их метаданные. Пример файла можно найти на странице Python plugin repositories.

Примечание: настройка IDE в Windows¶

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

Если используется установщик OSGeo4W, командный файл можно найти в каталоге bin папки, куда выполнена установка OSGeo4W. Ищите что-то похожее на C:\OSGeo4W\bin\qgis-unstable.bat .

Далее будет описана настройка Pyscripter IDE. Настройка других сред разработки может несколько отличаться:

  • Сделайте копию qgis-unstable.bat и переименуйте её в pyscripter.bat.
  • Откройте это файл в редакторе. Удалите последнюю строку, которая отвечает за запуск QGIS.
  • Добавьте строку для запуска pyscripter с параметром, указывающим на используемую версию Python. QGIS 1.5 использует Python 2.5.
  • Добавьте еще один аргумент, указывающий на каталог, где pyscripter должен искать библиотеки Python, используемые qgis. Обычно это каталог bin папки, куда установлен OSGeo4W:

@echo off SET OSGEO4W_ROOT=C:\OSGeo4W call "%OSGEO4W_ROOT%"\bin\o4w_env.bat call "%OSGEO4W_ROOT%"\bin\gdal16.bat @echo off path %PATH%;%GISBASE%\bin start C:\pyscripter\pyscripter.exe --python25 --pythondllpath=C:\OSGeo4W\bin

Теперь при запуске этого командного файла установятся необходимые переменные окружения и будет запущен pyscripter.

Как создать свое расширение файла

Проектирование и изготовление рукавного фильтра Компания ТЕКС.

Размещение сквозной ссылки

Регистрация расширений файлов с помощью реестра Windows

На написание этой статьи меня подвигло одно небольшое происшествие: одна из женщин на работе обратилась ко мне с вопросом — у нее значок Вордовского файла отображался не как для этих файлов, а как для незарегистрированного типа. Попробовал зарегистрировать его, используя пункт контекстного меню «Открыть с помощью», но файл открылся, а значок не изменился. Был конец рабочего дня, поэтому я протормозил пару минут, пока не догадался посмотреть расширение файла. Его не было 🙂 — это и не позволяло ассоциировать файл с приложением. Вот я и решил написать статью о регистрации расширений файлов. Что это дает? Вы можете двойным кликом открыть файл с помощью ассоциированного приложения, добавить на него дополнительные команды (например, печать, быстрый просмотр и т.п.). Для этого вовсе не обязательно лезть в реестр — можно все сделать с помощью того же меню «Открыть с помощью. » или проводника, но это не всегда удобно. Так, если вам надо сделать одну и ту же операцию, скажем, на десятке компьютеров, то гораздо проще написать reg-файл и установить его на всех машинах. Или вы распространяете программу, использующую ваш формат файлов, и чтобы ассоциировать файлы с программой на машинах пользователей автоматически надо использовать либо тот же reg-файл, либо править реестр из программы. Вот для этих случаев и нужна эта статья.

Файлы регистрируются в разделе HKEY_CLASSES_ROOT. Для примера зарегистрируем файл с расширением .diz — многие программы поставляются с файлом описания, имеющим такое расширение. Неплохо было бы при запуске его просматривать содержимое в текстовом редакторе, например, Блокноте. Создайте раздел с именем .diz, в параметр которого «По умолчанию» добавьте запись «DIZ-File» (без кавычек).

В разделе HKEY_CLASSES_ROOT создайте еще один раздел с именем, которое было в параметре «По умолчанию», т.е. DIZ-File. Задайте значение «По умолчанию» равное «Описание программы» и в этом же разделе создайте подразделы shell и DefaultIcon.

В подразделе shell создайте еще один подраздел Open, а в нем раздел command. Значение command «По умолчанию» должно быть «C:\\windows\\notepad.exe \»%1\»». В разделе DefaultIcon параметр «По умолчанию» задайте равным «C:\\windows\\notepad.exe,1». Получилось все несколько сумбурно и запутанно, но приведенный ниже reg-файл должен устранить все неясности

[HKEY_CLASSES_ROOT\DIZ-File]
@=»Описание программы»

[HKEY_CLASSES_ROOT\DIZ-File\shell\Open\command]
@=»C:\\windows\\notepad.exe \»%1\»»

Теперь все стало несколько понятнее. Надеюсь, вы обратили внимание на то, что в пути файла вместо одного символа \ используется \\ и кавычка задается как \». При открытии файла используется параметр %1 после полного имени файла Блокнота (кстати, путь к нему у вас может быть другим). Этот параметр передает выбранный файл в Блокнот. Если путь к файлу приложения содержит пробелы, то он должен быть заключен в кавычки.

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

[HKEY_CLASSES_ROOT\DIZ-File\shell\print\command]
@=»C:\\windows\\notepad.exe /p \»%1\»»

Думаю, аналогия понятна. Теперь вы и сами можете добавить любой пункт меню к любому зарегистрированному типу файлов. Так, можно было бы добавить просмотр файлов diz в WordPad’e, Word’e или еще где-то. Возможности по редактированию контекстного меню файлов весьма обширные и я надеюсь, что мне удалось довольно понятно объяснить технологию добавления новых пунктов. Ну, а если что-то будет непонятно, пишите.

Финансы: форекс для тебя

Создание файлов собственного типа

Скиньте, пожалуйста, литературу по созданию файлов со своим расширением, как создать своё расширение (например: file.abcdefg) или др.

Лучшие ответы ( 3 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:

Передача параметра собственного типа потоку
Потоку можно передавать один параметр типа Object. Это работает если тебе нужно передать переменную.

Как создать массив объектов собственного типа
Как создать массив, в котором в одном элементу arr будут хранится данные собственного типа .

Как посчитать Мах и Avg для собственного типа?
var composlugy = new < new

Описать класс – наследник коллекции элементов собственного типа
Описать класс – наследник коллекции элементов собственного типа. Заполнить коллекцию пятью.

136 / 104 / 9
Регистрация: 30.01.2011
Сообщений: 699

Расширение?!
Своим расширением будет любой файл, который запишешь по собственному алгоритму(к примеру сохранение в батник, сначала свой заголовок, потом контент и та далее)
Ну и сохраняй его с другим расширением в имени.

Регистрация: 10.03.2011
Сообщений: 354

просто сохранить его с расширение абракадабра. Это если вам нужно что потом именно это расширение открывалось вашей программой. то тут нужно немного дописать кода

719 / 710 / 168
Регистрация: 15.06.2011
Сообщений: 1,704

Создай файл file.blablabla и попробуй в него записывать и читать, впринципе вообще ничего не измениться! а если ты хочешь что-бы никто другой читать их не мог — тут ттебе правильно ответили — файл должен быть записан по твоему алгоритму.

1 2 3 4 5 6 7 8
using (StreamReader str = new StreamReader(@"c:\file.blablabla", Encoding.Default)) //Прочитали файл с расширением blablabla { MessageBox.Show(str.ReadLine()); } File.Create(@"c:\myFile.blablabla"); //Создали файл с расширением blablabla

151 / 53 / 11
Регистрация: 18.09.2011
Сообщений: 730

Лучший ответ

Сообщение было отмечено как решение

Решение

То что выше, хоть даже будет file.blablabla, любой пользователь откроет данный файл через текстовый редактор, к примеру блокнот и вычитает все, что там внутри. Я думаю — это не то, что нужно по данной теме.

Добавлено через 2 минуты
Самым простым способом, я думаю — это саморучное кодирование и считывание строк, чтобы когда сохраняла данные — была кодировка, а когда читала — декодировка и все. Вот вам и ваш файл собственного типа, так -как открыв данный файл через блокнот — он ведь закодирован. Значит будет типа того: afW232KjsdkZ2900sdDSxc***|||**ds343wwWoOOPZ_^%#OSA

Эксперт .NET

4431 / 2091 / 404
Регистрация: 27.03.2010
Сообщений: 5,657
Записей в блоге: 1

Лучший ответ

Сообщение было отмечено как решение

Решение

Попробуй так создать свой формат, блокнотом точно не прочесть будет:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
using System; using System.Collections.Generic; using System.IO; namespace ConsoleApplication1 { class Program { static void Main(string[] args) { string file = Path.Combine(Environment.GetFolderPath( Environment.SpecialFolder.DesktopDirectory), "testFile.rgzs"); ListPerson> persons = new ListPerson>() { new Person(23u, "Андрей"), new Person(24u, "Сергей"), new Person(56u, "Алексей"), new Person(19u, "Дмитрий"), }; Person.Save(file, persons); ListPerson> loadedPersons = Person.Load(file); Console.WriteLine("Выводим загруженные из файла данные:"); foreach (Person person in loadedPersons) { Console.WriteLine(person); } Console.ReadKey(); } } }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54
public class Person { uint Age { get; set; } string Name { get; set; } public Person(uint age, string name) { this.Age = age; this.Name = name; } public Person() : this(0u, string.Empty) { } public override string ToString() { return string.Format("Имя: \tВозраст: ", Name, Age); } public static void Save(string path, IListPerson> persons) { using (FileStream fs = new FileStream(path, FileMode.OpenOrCreate, FileAccess.Write, FileShare.None)) using (BinaryWriter binWriter = new BinaryWriter(fs)) { binWriter.Write(persons.Count); //(Int32) записываем кол-во элементов for (int i = 0; i  persons.Count; i++) { binWriter.Write(persons[i].Age); //(UInt32) binWriter.Write(persons[i].Name); //(string) } } } public static ListPerson> Load(string path) { ListPerson> persons = null; using (FileStream fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read)) using (BinaryReader binReader = new BinaryReader(fs)) { int quantity = binReader.ReadInt32(); persons = new ListPerson>(quantity); for (int i = 0; i  quantity; i++) { uint age = binReader.ReadUInt32(); string name = binReader.ReadString(); persons.Add(new Person(age, name)); } } return persons; } }

Как сделать нестандартное расширение файла?

Возможно ли сделать без стороннего ПО нестандартное расширение файла? К примеру: .file, .bitcoin, .toster или .aye и т.д. Если нельзя, то не подскажите какими вы пользуетесь ПО для этой задачи?

UPD
получилось создать файл при помощи консоли с такой командой(их много) — cd. > .bitcoinnn

  • Вопрос задан более трёх лет назад
  • 7689 просмотров

2 комментария

Оценить 2 комментария

lazalu68

У меня например получилось:

KM-Brothers

Сергей Мирченко @KM-Brothers

Хочу вас предупредить: имена файлов, начинающиеся с точки, относятся к скрытым и (например) в Ubuntu не будут видны по умолчанию.

Решения вопроса 0
Ответы на вопрос 5

Ivanq

Знаю php, js, html, css

Если речь про Windows Explorer (aka File Explorer aka Проводник), жмете ПКМ -> Создать -> Текстовый документ, переименовываете файл. Если не показывается расширение, где-то в меню должна быть кнопка Изменить параметры папок и поиска, открываете вкладку Вид, отключаете галку Скрывать расширения для зарегистрированных типов файлов.

Если речь про модальные окна Сохранить файл, выбираете Все файлы как Тип файла и пишете имя файла с расширением (test.test).

А на уровне ядра Windows ограничений на нестандартные расширения вообще нет. Да и вроде уже нет 8.3.

Ответ написан более трёх лет назад
Нравится 5 3 комментария

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

pfg21: не совсем так, некоторые символы все же нельзя исподьзовать в имени файла, например кавычки, восклицательный знак, знак вопроса и некоторые другие. Еще до одной из последних редакций 10ки максимальная длина имени файла с именем диска и символом слэш между каталогами составляет что-то около 265символов. Нет, ntfs позволяет генерировать и более длинные пути, но у софта потом проблемы открыть файл. В линуксе такого нет

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *