Вот пример, показывающий, как рекурсивно искать файл с именем «post.php» из каталога «/ Users / mkyong / sites» и всех его подкаталогов.
import java.io.File;
import java.util.ArrayList;
import java.util.List;
public class FileSearch {
private String fileNameToSearch;
private List<String> result = new ArrayList<String>();
public String getFileNameToSearch() {
return fileNameToSearch;
}
public void setFileNameToSearch(String fileNameToSearch) {
this.fileNameToSearch = fileNameToSearch;
}
public List<String> getResult() {
return result;
}
public static void main(String[] args) {
FileSearch fileSearch = new FileSearch();
// try different directory and filename :)
fileSearch.searchDirectory(new File("/Users/mkyong/websites"), "post.php");
int count = fileSearch.getResult().size();
if (count == 0) {
System.out.println("\nNo result found!");
} else {
System.out.println("\nFound " + count + " result!\n");
for (String matched : fileSearch.getResult()) {
System.out.println("Found : " + matched);
}
}
}
public void searchDirectory(File directory, String fileNameToSearch) {
setFileNameToSearch(fileNameToSearch);
if (directory.isDirectory()) {
search(directory);
} else {
System.out.println(directory.getAbsoluteFile() + " is not a directory!");
}
}
private void search(File file) {
if (file.isDirectory()) {
System.out.println("Searching directory ... " + file.getAbsoluteFile());
// do you have permission to read this directory?
if (file.canRead()) {
for (File temp : file.listFiles()) {
if (temp.isDirectory()) {
search(temp);
} else {
if (getFileNameToSearch().equals(temp.getName().toLowerCase())) {
result.add(temp.getAbsoluteFile().toString());
}
}
}
} else {
System.out.println(file.getAbsoluteFile() + "Permission Denied");
}
}
}
}
Я задал аналогичный вопрос для C ++ . Вы должны быть в состоянии использовать слегка измененную (для C) версию того, что я придумал тогда.
bool isValidIpAddress(char *ipAddress)
{
struct sockaddr_in sa;
int result = inet_pton(AF_INET, ipAddress, &(sa.sin_addr));
return result != 0;
}
Вам понадобится #include
, чтобы использовать Функция inet_pton () .
Обновление на основе комментариев к вопросу: Если вы хотите узнать, содержит ли строка в стиле C IP-адрес, то вы должны объединить два ответа. дано до сих пор. Используйте регулярное выражение, чтобы найти шаблоны, которые приблизительно соответствуют IP-адресу, а затем используйте функцию выше, чтобы проверить соответствие, чтобы увидеть, является ли это реальной сделкой.
Я бы использовал это регулярное выражение (любезно предоставлено Примеры регулярных выражений ):
`\b(?:\d{1,3}\.){3}\d{1,3}\b`
Я дам решение «не хочу двух проблем»:
#include <string.h>
int isIp_v4( char* ip){
int num;
int flag = 1;
int counter=0;
char* p = strtok(ip,".");
while (p && flag ){
num = atoi(p);
if (num>=0 && num<=255 && (counter++<4)){
flag=1;
p=strtok(NULL,".");
}
else{
flag=0;
break;
}
}
return flag && (counter==3);
}
РЕДАКТИРОВАТЬ: strtok может быть не безопасным для потоков (кредиты Адаму Розенфилду)
Это процедура, которую я недавно написал для встраиваемой системы, которая генерирует различные подозрительные шаблоны в сети. Таким образом, он использует абсолютно никаких причудливых вещей, таких как сетевые библиотеки или даже стандартные библиотеки C, предпочитая держаться подальше от всего этого современного материала, такого как токенизация строк и (дрожь) библиотеки регулярных выражений :-) С этой целью , он подходит практически для любой среды, в которой вы можете оказаться, и он был ослепительно быстрым.
Хотя, если вы находитесь в среде, в которой есть что-то вроде checkIp4Addess ()
, я бы предложил Вы используете это вместо этого. Это указание на то, с чем вам иногда приходится мириться при выполнении встроенных вещей (хотя это является реальным решением).
int isValidIp4 (char *str) {
int segs = 0; /* Segment count. */
int chcnt = 0; /* Character count within segment. */
int accum = 0; /* Accumulator for segment. */
/* Catch NULL pointer. */
if (str == NULL)
return 0;
/* Process every character in string. */
while (*str != '\0') {
/* Segment changeover. */
if (*str == '.') {
/* Must have some digits in segment. */
if (chcnt == 0)
return 0;
/* Limit number of segments. */
if (++segs == 4)
return 0;
/* Reset segment values and restart loop. */
chcnt = accum = 0;
str++;
continue;
}
/* Check numeric. */
if ((*str < '0') || (*str > '9'))
return 0;
/* Accumulate and check segment. */
if ((accum = accum * 10 + *str - '0') > 255)
return 0;
/* Advance other segment specific stuff and continue loop. */
chcnt++;
str++;
}
/* Check enough segments and enough characters in last segment. */
if (segs != 3)
return 0;
if (chcnt == 0)
return 0;
/* Address okay. */
return 1;
}
В url / uri rfc 3986 адрес ipv4 расширенной формы Бэкуса-Наура (ABNF) определяется следующим образом:
IPv4address = dec-octet "." dec-octet "." dec-octet "." dec-octet
dec-octet = DIGIT ; 0-9
/ %x31-39 DIGIT ; 10-99
/ "1" 2DIGIT ; 100-199
/ "2" %x30-34 DIGIT ; 200-249
/ "25" %x30-35 ; 250-255
Я реализовал проверку с помощью регулярного выражения в следующей форме:
// Although the RFC says ipv6 octects like 001 are not valid, it would be risky
// not to accept those
#define decoct "([01]?[0-9]?[0-9]|2[0-4][0-0]|25[0-5])"
#define ipv4 "(" decoct "\\." decoct "\\." decoct "\\." decoct ")"
Это моя попытка с программированием на очень низком уровне C (фактически используется в одной из моих программ для микроконтроллера PIC).Он не использует библиотеку string.h. Он не использует указатели, так как этот компилятор, который я использую, не работает с ними, в любом случае вы можете их использовать. Принимая это во внимание и предварительно определяя переменную для обработки буфера входящих данных следующим образом:
#define isdigit(x) isamong(x,"0123456789")
char IPACK_Buff[IPACK_SIZE];
// Check if string is a valid IP
int IPACK_is_valid_ip(int len)
{
int i = 0;
int j = 0;
int NumDots = 0;
char number[4] = "000\0";
// Check first char is numeric
if (!isdigit(IPACK_Buff[0]))
return 0;
for (i = 0 ; i< len; i++)
{
if (isdigit(IPACK_Buff[i]))
{
number[j] = IPACK_Buff[i];
j++;
if (j>3)
return 0;
}
else if (IPACK_Buff[i] == '.')
{
if (atof(number)> 255) return 0;
memset(number, '\0', 4);
j = 0;
NumDots++;
if(NumDots>3)
return 0;
}
}
if (NumDots == 3)
{
return 1;
}
else
return 0;
}//
Я надеюсь, что эта функция поможет вам всем. Опять же, примите во внимание низкий уровень, эта функция запрограммирована, прежде чем критиковать.