Должно быть возможным вызвать исполняемый файл с определенным рабочим каталогом, используя Runtime.exec(String command, String[] envp, File dir)
следующим образом:
Process process2=Runtime.getRuntime().exec("/data/data/my-package/files/myfile",
null, new File("/data/data/my-package/files"));
, возможно, без полный путь к myfile
Process process2=Runtime.getRuntime().exec("myfile",
null, new File("/data/data/my-package/files"));
Context#getFilesDir()
вместо жесткого кодирования, путь тоже должен работать и безопаснее, чем указывать путь самостоятельно, так как не гарантируется, что /data/data/..
всегда правильный путь для всех устройств.
Process process2=Runtime.getRuntime().exec("myfile",
null, getFilesDir()));
Проблема с cd somewhere
заключается в том, что каталог изменен для другого Процесса, поэтому второй вызов exec
в новом Процессе не видит изменения.
Я предполагаю, что вы хотите сопоставить эти диапазоны:
127. 0.0.0 – 127.255.255.255 127.0.0.0 /8 10. 0.0.0 – 10.255.255.255 10.0.0.0 /8 172. 16.0.0 – 172. 31.255.255 172.16.0.0 /12 192.168.0.0 – 192.168.255.255 192.168.0.0 /16
У вас отсутствуют некоторые точки, которые могли бы привести к его принятию, например, 172.169.0.0
, даже если это не должно быть принято. Я исправил это ниже. Удалите новые строки, это просто для удобства чтения.
(^127\.)|
(^10\.)|
(^172\.1[6-9]\.)|(^172\.2[0-9]\.)|(^172\.3[0-1]\.)|
(^192\.168\.)
Также обратите внимание, что это предполагает, что IP-адреса уже были проверены - он принимает такие вещи, как 10.foobar
.
Это на случай, если вы решите согласиться с моим комментарием, предлагающим не использовать regexps. Непроверено (но, вероятно, работает, или, по крайней мере, близко), в Perl:
@private = (
{network => inet_aton('127.0.0.0'), mask => inet_aton('255.0.0.0') },
{network => inet_aton('192.168.0.0'), mask => inet_aton('255.255.0.0') },
# ...
);
$ip = inet_aton($ip_text);
if (grep $ip & $_->{mask} == $_->{network}, @private) {
# ip address is private
} else {
# ip address is not private
}
Обратите внимание, что @private
- это просто данные, которые вы можете легко изменить. Или загрузите на лету из Cymru Bogon Reference.
edit: Мне пришло в голову, что запрос на Perl regexp не означает, что вы знаете Perl, поэтому ключевой строкой здесь является 'grep', который просто перебирает каждый диапазон частных адресов. Вы берете свой IP, побитово складываете его с маской сети и сравниваете с сетевым адресом. Если они равны, то он является частью этой частной сети.
Выглядит правильно. Лично я бы изменил первый вариант на:
^127\.0
С этим: (^127\.0\.0\.0\.1)
вы ищете все, что начинается с 127.0.0.1
и пропустите 127.0.0.2*
, 127.0.2.*
, 127.0.*
и т.д.